`iter(callable, sentinel)` 还是 Pythonic 的吗?

Is `iter(callable, sentinel)` still Pythonic?

iter函数的第二个参数对很有用,比如二进制文件:

response = b''
for block in iter(partial(f.read, 256), b''):
    response += block

但是在 Python 3.8 中我们现在有了“海象运算符”,在 What's new in Python 3.8 文章中提到它是解决上述问题的方法:

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

不知后者现在算不算"the right approach"?如果是这样,如果需要 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)): 这样的循环可能很难转换为新语法 (?)

The PEP for walrus 在示例 while h(x := f()): g(x) 中只提到了 2-arg iter,它说不能平凡地翻译成 iter.

Python 通常对这类事情有非常精确的指导方针,但我还没有找到任何关于这个特定问题的指导方针。你能帮帮我吗?

如果您主要对立即迭代迭代器感兴趣,则赋值表达式很有用,但它无法帮助您定义要在别处使用的迭代器。

例如,在使用for循环。