Является ли `iter (callable, sentinel)` все еще Pythoni c? - PullRequest
1 голос
/ 26 января 2020

Второй аргумент функции 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, как правило, имеют довольно точные рекомендации по такого рода вещам, но я не смог найти ни одного для этой конкретной проблемы , Вы можете мне помочь?

1 Ответ

1 голос
/ 26 января 2020

Выражение присваивания полезно, если вы в первую очередь заинтересованы в немедленной итерации по итератору, но оно не помогает определить итератор для использования в другом месте.

Например, вы можете создать итератор, который сначала будет заключен в map, или filter, или itertools.islice, прежде чем окончательно выполнить итерацию по окончательному результату, используя for l oop.

...