Каков питонический способ представления Iterable, который можно повторять несколько раз?Python

Программы на Python
Ответить
Anonymous
 Каков питонический способ представления Iterable, который можно повторять несколько раз?

Сообщение Anonymous »

Я хотел бы получить ваш совет относительно наиболее питонического способа выражения следующей функции в Python с подсказками по типу:
Я хотел бы представить функцию как часть библиотеки, которая принимает входной аргумент и возвращает выходной результат. Контракт для входного аргумента должен быть следующим:
  • моя функция может перебирать его
  • это нормально, если моя функция поддерживает ссылку на вход (например, возвращая объект, который хранит эту ссылку)
  • можно перебирать входные данные более одного раза
Примером может быть функция, которая принимает последовательность URL-адреса, а затем отправляет запросы к этим URL-адресам, возможно, с некоторой логикой повтора, поэтому мне придется повторять исходную последовательность более одного раза. Но мой вопрос более общий, чем просто этот пример.
На первый взгляд подходящей подписью будет:

Код: Выделить всё

from typing import Iterable

def do_sth(input: Iterable[str]) -> SomeResult:
...
Однако это нарушает третье требование, поскольку в Python нет гарантии, что вы сможете перебирать Iterable более одного раза, например потому что итераторы и генераторы сами по себе являются итерируемыми.
Может быть другая попытка:

Код: Выделить всё

from typing import Sequence

def do_sth(input: Sequence[str]) -> SomeResult:
...
Но тогда контракт Sequence — это больше, чем требуется моей функции, поскольку он включает в себя индексированный доступ, а также знание длины.
Мне пришло в голову решение — использовать подпись Iterable, а затем внутренне скопировать входные данные. Но это, похоже, создает потенциальную проблему с памятью, если исходная последовательность велика.
Есть ли решение этой проблемы, т. е. знает ли Python о концепции Iterable, которая каждый раз будет возвращать новый итератор?

Подробнее здесь: https://stackoverflow.com/questions/631 ... -over-mult
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»