Python标准库中`while False:`的作用?以Iterable类实现为例
为什么CPython的collections.abc.Iterable用
while False: yield None而非pass? 先看collections.abc.Iterable的完整实现代码:
class Iterable(metaclass=ABCMeta): __slots__ = () @abstractmethod def __iter__(self): while False: yield None @classmethod def __subclasshook__(cls, C): if cls is Iterable: return _check_methods(C, "__iter__") return NotImplemented __class_getitem__ = classmethod(GenericAlias)
这段while False: yield None永远不会执行,但不能直接换成pass,核心原因有这几点:
- 符合迭代器协议的类型要求:
__iter__方法的规范是必须返回迭代器对象。生成器函数(哪怕是空的)天然会返回迭代器,而如果用pass,这个抽象方法默认返回None,类型上完全不符合要求。静态类型检查工具(比如mypy)会通过这个生成器写法,识别出__iter__的返回类型是迭代器,从而在子类实现时做类型校验。 - 保持方法行为的一致性:即使是抽象方法,它的签名和预期行为也要和实际子类实现对齐。用生成器写法明确了这个方法的本质是要返回一个可迭代的迭代器,避免子类实现时出现返回非迭代器的错误。
- 历史兼容因素:早期Python版本对抽象方法的约束更严格,这种写法能确保在老版本中也能正确体现
__iter__的方法类型,避免出现运行时类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Wood
相关产品推荐
相关产品推荐

