Как я могу применить 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
атрибут