Второй аргумент функции 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)
Я предполагаю, что все еще могут быть случаи, когда мы не хотим сразу делать итерацию oop, такую как b''.join(iter(partial(f.read, 256), b''))
или некоторый код (хотя он быстро становится довольно проблематичным). Также все oop как for i, x in enumerate(iter(f, y)):
может быть трудно перевести на новый синтаксис (?)
В PEP для моржей упоминается только 2-arg iter
в примере while h(x := f()): g(x)
, который, как говорится, не может быть тривиально переведен на iter
.
Python, как правило, имеют довольно точные рекомендации по такого рода вещам, но я не смог найти ни одного для этой конкретной проблемы , Вы можете мне помочь?