跳到内容

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__ 方法,该修复被标记为不安全。