Как я могу применить iter () к API пагинации? - PullRequest
0 голосов
/ 23 декабря 2018

Я наблюдал за речью Рэймонда Хеттингера Идиоматический Питон и узнал об аргументе дозорного до iter().Я хотел бы попробовать применить его к коду кода, над которым я работаю, перебирая API, который использует нумерацию страниц (это Twilio, но не относится к моему вопросу).

У меня есть API, который возвращает: список данных и URL следующей страницы.Когда разбиение на страницы исчерпано, URL следующей страницы возвращается в виде пустой строки.Я написал функцию извлечения как генератор и выглядит примерно так:

def fetch(url):
    while url:
        data = requests.get(url).json()
        url = data['next_page_uri']
        for row in data[resource]:
            yield row

Этот код работает нормально, но я хотел бы попытаться удалить цикл while и заменить его вызовом iter() используя значение next_page_uri в качестве аргумента часового.Альтернативно, это могло быть написано с yield from?

1 Ответ

0 голосов
/ 24 декабря 2018

Я думаю, что это может быть то, что вы имеете в виду ... но, как указано в комментариях, это не очень помогает:

def fetch_paged(url):
    while url:
        res = requests.get(url)
        res.raise_for_status()
        data = res.json()
        yield data
        url = data['next_page_uri']

def fetch(url):
    for data in fetch_paged(url):
        yield from data[resource]

(Я воспользовался возможностью, чтобы позвонить raise_for_status() который будет raise для неуспешных, то есть res.status_code < 400, ответов)

не уверен, что это "лучше", но, возможно, если вы собираетесь многократно использовать функциональность fetch_paged

Примечание: многие другие API помещают этот next_page_uri в заголовки ответа стандартными способами , с которыми библиотека requests знает, как иметь дело, и предоставляет через res.links атрибут

...