Как я могу применить iter() к API пагинации?

Я смотрел выступление Рэймонда Хеттингера " Идиоматический Питон" и узнал об аргументе дозорного 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 ответ

Решение

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

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 атрибут

Другие вопросы по тегам