1 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊
我不確定您是在討論P(yáng)age類型還是Iterator類型,因?yàn)樗鼈兌际堑?,并且都存在相同的問題,并且您只給了我們關(guān)于您在做什么的模糊描述一個(gè)你正在做的。但是以下所有內(nèi)容同樣適用于它們中的任何一個(gè)(一個(gè)音符除外),所以我將討論P(yáng)age,因?yàn)樗歉?jiǎn)單的一個(gè)。
迭代器只能使用一次。這就是成為迭代器意味著什么。
你可以使用tee拆斷的第二迭代器,其從第一個(gè)高速緩存中的值。
但是,如果您的目標(biāo)是一遍又一遍地迭代相同的值,則有一個(gè)簡(jiǎn)單得多的解決方案:只需將迭代器復(fù)制到一個(gè)序列中即可,例如alist或。tuple然后,您可以根據(jù)需要進(jìn)行多次迭代。
page = list(Page(data, …))
for thing in page:
print(thing)
for thing in page:
print(thing)
在執(zhí)行此操作時(shí),您Iterator不是有效的迭代器:
def __iter__(self):
return self._iter_items()
def __next__(self):
return next(self._iter_items())
迭代器必須以的方式self從中返回。Python不會(huì)強(qiáng)制執(zhí)行該規(guī)則,因此,如果您犯了此錯(cuò)誤,則通常會(huì)得到似乎可以在一個(gè)測(cè)試中工作的東西,但是在其他地方卻做錯(cuò)了事。__iter__Page
或者……您確定要Page成為迭代器,而不是可重用的,非迭代器可迭代的嗎?
class Page:
def __init__(self, json_data, *args, **kwargs):
self.client = kwargs.get("client")
self.next_page_url = json_data["pages"]["next_url"]
self.previous_page_url = json_data["pages"]["previous_url"]
self.total_count = json_data["total_count"]
def __iter__(self):
return iter(datum for datum in json_data["data"])
現(xiàn)在,您無需將數(shù)據(jù)復(fù)制到a中,list除非您要執(zhí)行列表操作,例如以隨機(jī)順序?qū)?shù)據(jù)進(jìn)行索引:
page = Page(data, …)
for thing in page:
print(thing)
for thing in page:
print(thing)
附帶說明一下,這是重復(fù)的:
iter(datum for datum in json_data["data"])
這(datum for datum in json_data["data"])與json_data["data"]包裹在生成器表達(dá)式中的一樣。由于生成器表達(dá)式已經(jīng)是迭代器,因此您可以返回它:
return (datum for datum in json_data["data"])
或者,甚至更簡(jiǎn)單地,您可以只對(duì)數(shù)據(jù)返回一個(gè)迭代器:
return iter(json_data["data"])
而且,如果您實(shí)際上想要list-y序列行為,則甚至可以Sequence很輕松地使其完全成熟:
class Page:
def __init__(self, json_data, *args, **kwargs):
self.client = kwargs.get("client")
self.next_page_url = json_data["pages"]["next_url"]
self.previous_page_url = json_data["pages"]["previous_url"]
self.total_count = json_data["total_count"]
def __len__(self):
return len(json_data["data"])
def __getitem__(self, index):
return json_data["data"][index]
現(xiàn)在:
page = Page(data, …)
for thing in page:
print(thing)
for thing in reversed(page):
print(thing)
for thing in page[-6:-2]:
print(thing)
添加回答
舉報(bào)