Python &引用;加上-比如在迭代器上调用next的语法?
编辑:这是的副本 我的代码:Python &引用;加上-比如在迭代器上调用next的语法?,python,python-3.x,Python,Python 3.x,编辑:这是的副本 我的代码: try: y = next(x) z = next(y) f(y, z) except StopIteration: pass 我想写的是: with x as y, y as z: f(y, z) 但是,这会引发AttributeError:\uuu输入\uu 如果with不是合适的习惯用法,那么除了StopIteration:pass之外,我在没有显式的情况下做的事情是否有其他习惯用法,或者是否有一种方法将迭代器包装成
try:
y = next(x)
z = next(y)
f(y, z)
except StopIteration:
pass
我想写的是:
with x as y, y as z:
f(y, z)
但是,这会引发AttributeError:\uuu输入\uu
如果with
不是合适的习惯用法,那么除了StopIteration:pass之外,我在没有显式的情况下做的事情是否有其他习惯用法,或者是否有一种方法将迭代器包装成支持with
的类型?语义应该与第一个代码段中的语义完全相同
我这样问是因为x中y的在这种情况下不起作用。如果要从迭代器中检索一个项,方法是next
。它没有单独的成语next
是专用的“从迭代器获取一件事”函数与
绝对不是<代码>与
用于资源清理
您的代码非常奇怪,很难想象会为其添加专门的语法
如果你真的想用不同的方式写,你可以这样做
for y in x:
for z in y:
f(y, z)
break
break
或
用于缩短try:
-除(*异常,):传递构造:
from contextlib import suppress
with suppress(StopIteration):
y = next(x)
f(y, next(y))
不可能使用辅助对象(x)为y、辅助对象(y)为z的语法:
:上下文管理器必须返回值或引发异常。这使得当next(x)
或next(y)
不返回值时,无法优雅地处理这种情况。使用的目的是在退出块时自动清理资源。这与迭代器有什么关系?很难想象上下文使这些代码变得有意义,这也不能解释为什么不能对迭代器使用for
。这可能有助于了解x
的类型是如何定义的,以及您试图通过f
解决的问题。正如问题明确提出的那样,如果with
不是忽略停止迭代
的合适习惯用法,是否有另一个合适的习惯用法?您拒绝显式try
语法的标准是什么?您正在寻找较短的代码吗?您的目标是不保护f
不受StopIteration
(该尝试:
不受的影响,但不受的影响)吗?有没有什么原因使得x
必须像这样展开,并且可能被绕过?没有那么复杂。它只是要求一种方法来捕获并忽略StopIteration
,而不使用除StopIteration
之外的显式。动机和人们回答的一模一样。一个完全有效且信息丰富的答案是“没有专门用于忽略StopIteration
的功能,但这里有一个用于忽略您指定的任何异常的功能”,这正是公认的答案所做的。
from contextlib import suppress
with suppress(StopIteration):
y = next(x)
f(y, next(y))