generator-return-from-iter-method (PYI058)
源自 flake8-pyi 代码检查器。
有时提供修复。
作用
检查返回 Generator
的简单 __iter__
方法,以及返回 AsyncGenerator
的简单 __aiter__
方法。
为什么这不好?
对于这些方法,使用 (Async)Iterator
更简单优雅。更重要的是,它也反映了从 __iter__
方法返回的迭代器的确切类型通常是一个实现细节,随时可能更改。类型注解有助于定义函数的契约;实现细节不应泄露到该契约中。
例如
from collections.abc import AsyncGenerator, Generator
from typing import Any
class CustomIterator:
def __iter__(self) -> Generator:
yield from range(42)
class CustomIterator2:
def __iter__(self) -> Generator[str, Any, None]:
yield from "abcdefg"
建议改为
from collections.abc import Iterator
class CustomIterator:
def __iter__(self) -> Iterator:
yield from range(42)
class CustomIterator2:
def __iter__(self) -> Iterator[str]:
yield from "abdefg"
修复安全性
此规则会努力避免误报错误,并且该规则的修复对于 .pyi
存根文件始终应该是安全的。但是,当应用于运行时 Python(.py
文件)时,此规则可能会发出误报的几率略高。因此,对于 .py
文件中主体中有两个以上语句(包括文档字符串)的任何 __iter__
或 __aiter__
方法,该修复被标记为不安全。