Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3487d68

Browse files
authored
feat: add iterator capability to paged iterators (#200)
* feat: add iterator capability to *Iterator classesThe *Iterator classes are only _iterables_, and this commit also makesthem _iterators_, i.e. calling next(iterator) on them now works.* Make AsyncIterator an actual async iterator
1 parent641fbbf commit3487d68

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

‎google/api_core/page_iterator.py‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@ def __init__(
170170
max_results=None,
171171
):
172172
self._started=False
173+
self.__active_iterator=None
174+
173175
self.client=client
174176
"""Optional[Any]: The client that created this iterator."""
175177
self.item_to_value=item_to_value
@@ -228,6 +230,14 @@ def __iter__(self):
228230
self._started=True
229231
returnself._items_iter()
230232

233+
def__next__(self):
234+
ifself.__active_iteratorisNone:
235+
self.__active_iterator=iter(self)
236+
returnnext(self.__active_iterator)
237+
238+
# Preserve Python 2 compatibility.
239+
next=__next__
240+
231241
def_page_iter(self,increment):
232242
"""Generator of pages of API responses.
233243

‎google/api_core/page_iterator_async.py‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ def __init__(
101101
max_results=None,
102102
):
103103
self._started=False
104+
self.__active_aiterator=None
105+
104106
self.client=client
105107
"""Optional[Any]: The client that created this iterator."""
106108
self.item_to_value=item_to_value
@@ -159,6 +161,11 @@ def __aiter__(self):
159161
self._started=True
160162
returnself._items_aiter()
161163

164+
asyncdef__anext__(self):
165+
ifself.__active_aiteratorisNone:
166+
self.__active_aiterator=self.__aiter__()
167+
returnawaitself.__active_aiterator.__anext__()
168+
162169
asyncdef_page_aiter(self,increment):
163170
"""Generator of pages of API responses.
164171

‎tests/asyncio/test_page_iterator_async.py‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,33 @@ def test_constructor(self):
4747
assertiterator.next_page_token==token
4848
assertiterator.num_results==0
4949

50+
@pytest.mark.asyncio
51+
asyncdeftest_anext(self):
52+
parent=mock.sentinel.parent
53+
page_1=page_iterator_async.Page(
54+
parent, ("item 1.1","item 1.2"),page_iterator_async._item_to_value_identity
55+
)
56+
page_2=page_iterator_async.Page(
57+
parent, ("item 2.1",),page_iterator_async._item_to_value_identity
58+
)
59+
60+
async_iterator=PageAsyncIteratorImpl(None,None)
61+
async_iterator._next_page=mock.AsyncMock(side_effect=[page_1,page_2,None])
62+
63+
# Consume items and check the state of the async_iterator.
64+
assertasync_iterator.num_results==0
65+
assertawaitasync_iterator.__anext__()=="item 1.1"
66+
assertasync_iterator.num_results==1
67+
68+
assertawaitasync_iterator.__anext__()=="item 1.2"
69+
assertasync_iterator.num_results==2
70+
71+
assertawaitasync_iterator.__anext__()=="item 2.1"
72+
assertasync_iterator.num_results==3
73+
74+
withpytest.raises(StopAsyncIteration):
75+
awaitasync_iterator.__anext__()
76+
5077
deftest_pages_property_starts(self):
5178
iterator=PageAsyncIteratorImpl(None,None)
5279

‎tests/unit/test_page_iterator.py‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,26 @@ def test_constructor(self):
109109
assertiterator.next_page_token==token
110110
assertiterator.num_results==0
111111

112+
deftest_next(self):
113+
iterator=PageIteratorImpl(None,None)
114+
page_1=page_iterator.Page(
115+
iterator, ("item 1.1","item 1.2"),page_iterator._item_to_value_identity
116+
)
117+
page_2=page_iterator.Page(
118+
iterator, ("item 2.1",),page_iterator._item_to_value_identity
119+
)
120+
iterator._next_page=mock.Mock(side_effect=[page_1,page_2,None])
121+
122+
result=next(iterator)
123+
assertresult=="item 1.1"
124+
result=next(iterator)
125+
assertresult=="item 1.2"
126+
result=next(iterator)
127+
assertresult=="item 2.1"
128+
129+
withpytest.raises(StopIteration):
130+
next(iterator)
131+
112132
deftest_pages_property_starts(self):
113133
iterator=PageIteratorImpl(None,None)
114134

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp