Рассмотрим следующий код:Как проверить, можно ли повторить повторный вызов?
def my_fun(an_iterable):
for val in an_iterable:
do_work(val)
if some_cond(val):
do_some_other_work(an_iterable)
break
если an_iterable
является list
/tuple
, do_some_other_work
получите весь список снова. Но если an_iterable
был iterator
или generator
, он получит только остальные элементы в списке. Как я могу различать два случая? Я хочу, чтобы do_some_other_work
получил только остальные предметы.
бы с помощью 'isinstance (объект, генератор) или hasattr (OBJ,«ряд»)' работы? Итераторы должны поддерживать 'next', а другие проверяют тип генератора. –
Нет ли других типов стандартных объектов python, которые поддерживают только одно перемещение? Как функция генератора? – balki
Вы _could_ используете 'tee' или более простую оболочку, которая позволяет вам заглянуть в один элемент без потребления, или тот, который позволяет вам возвращаться на итератор (по цепочке) или даже просто« list »в качестве обертки. Затем вы можете разрушить проверку, перезапускается ли итератор, и вы все равно не потеряли данные (потому что они находятся в обертке). Но это было бы глупо. – abarnert