Второй аргумент функции iter
полезен для перебора объектов, которые не определяют себя как итерируемые, например двоичных файлов. :
response = b''
for block in iter(partial(f.read, 256), b''):
response += block
Однако в Python 3.8 у нас теперь есть «оператор моржа», который в Что нового в Python 3.8 упоминается как способ решения указанной выше проблемы:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
Интересно, последнее сейчас считается "правильным подходом"? И если да, то нужен ли когда-либо второй аргумент iter
, так как любой код в форме
for x in iter(f, y):
g(x)
теперь можно было бы написать:
while (x := f()) != y:
g(x)
Я предполагаю, что все еще могут быть случаи, когда мы не хотим сразу зацикливать итерируемый объект, такой как b''.join(iter(partial(f.read, 256), b''))
или какой-то код (хотя это быстро становится довольно сложным). Также такой цикл, как for i, x in enumerate(iter(f, y)):
, может быть сложно перевести в новый синтаксис(?)
PEP для walrus упоминает только 2-arg iter
в примере while h(x := f()): g(x)
, который, как говорится, не может быть тривиально переведен на iter
.
Python обычно имеет довольно точные рекомендации по такого рода вещам, но мне не удалось найти их для этой конкретной проблемы. Можете вы помочь мне?
f.read(256)
не является допустимым первым аргументом для двухаргументной формыiter
; Я думаю, вы имеете в видуiter(lambda: f.read(256), b'')
. - person chepner   schedule 26.01.2020iter(..., ...)
по-прежнему будет полезен в качестве отправной точки для создания итератора, например, с использованием типов, определенных модулемitertools
. - person chepner   schedule 26.01.2020iter(callable, sentinel)
никогда не был Pythonic, учитывая, как редко его можно увидеть. :) - person chepner   schedule 26.01.2020