第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

迭代器以屏蔽API的多個(gè)頁面

迭代器以屏蔽API的多個(gè)頁面

躍然一笑 2021-04-08 14:15:35
我在python中為某些api構(gòu)建API客戶端,當(dāng)它出現(xiàn)在多個(gè)頁面中時(shí),它提供以下數(shù)據(jù)布局:{    "data":["some","pieces","of","data],    "results_per_page=2500,    "total_results": 10000    "next_url": "http://fullyqualifiedurl.com/results_after=5000"    "previous_url": "http://fullyqualifiedurl.com/results_after=2500}我想要一個(gè)客戶端可以調(diào)用的迭代器,如下所示:>>> results = client.results()>>> result_count = 0>>> for result in results:>>>     result_count += 1>>> print(result_count)10000在迭代器中,迭代器在到達(dá)其當(dāng)前頁面末尾時(shí)以靜默方式請(qǐng)求新頁面數(shù)據(jù)。我已經(jīng)開發(fā)了一些可以產(chǎn)生頁面的東西,但是在隨后的調(diào)用中,我不想不必重新獲取數(shù)據(jù)。這是我所擁有的:Class Iterator:    def __init__(self, current_page, max_results=None):        self.current_page = current_page        self.max_results = max_results        self.yielded_count = 0    def _iter_items(self):        for page in self._iter_page():            for item in page:                # early break from page if we have set a limit.                if self._limit_reached():                    raise StopIteration                self.yielded_count += 1                yield item    def _iter_page(self):        while self.current_page is not None:            yield self.current_page            if self._has_next_page():                self.current_page = self._get_next_page()            else:                self.current_page = None    def __iter__(self):        return self._iter_items()    def __next__(self):        return next(self._iter_items())    def _iter_page(self):        while self.current_page is not None:            yield self.current_page            if self._has_next_page():                self.current_page = self._get_next_page()            else:                self.current_page = None    def _get_next_page(self):        if self.current_page.next_page_url:            return self.api_request(self.current_page.next_page_url)        else:            return None現(xiàn)在發(fā)生的事情是,我可以一次成功地對(duì)其進(jìn)行迭代,但是在第二次迭代中,迭代器為空。我希望它在第一次搜索時(shí)緩存結(jié)果,并允許后續(xù)迭代。我會(huì)以完全錯(cuò)誤的方式進(jìn)行此操作嗎?我覺得應(yīng)該為此建立既定模式,但實(shí)際上找不到任何東西。
查看完整描述

1 回答

?
DIEA

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)


查看完整回答
反對(duì) 回復(fù) 2021-04-27
  • 1 回答
  • 0 關(guān)注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)