如何在Python方法内判断yield是否已被触发?
关于生成器内部检查yield是否触发的问题
Python的生成器函数本身没有内置的状态属性可以直接判断是否已经触发过yield操作,所以你当前使用标记变量(比如check)的方案,其实是最简洁、符合Python编码习惯的实现方式。
为什么没有内置方法?
生成器的执行逻辑是“暂停-恢复”的惰性迭代模式,其内部没有公开的标志位来记录是否已经执行过yield语句。所有能检查生成器状态的方法(比如调用next())都需要在生成器对象外部操作,无法在生成器函数内部直接获取这类状态。
优化你的现有代码
可以把标记变量名改成更具语义的名称,提升代码可读性:
from typing import Generator def my_method(my_list: list) -> Generator[str, None, None]: has_yielded = False for el in my_list: if el == "foo": has_yielded = True yield el if has_yielded and el == "bar": break
注:原代码的返回类型List[Iterable]有误,生成器函数的正确返回类型应为Generator或Iterable
结论
不要试图寻找“更高级”的内置方法来获取这个状态,手动维护标记变量是最直接且清晰的实现方式,不会引入额外的复杂度。
内容的提问来源于stack exchange,提问作者junsuzuki
相关产品推荐
相关产品推荐

