PyCharm 类型提示枚举迭代

PyCharm type hinting enum iteration

Python 的枚举 class 支持迭代,但 PyCharm 无法解决这个问题。

from enum import Enum

class Color(Enum):
    RED = 0
    BLUE = 1

for color in Color:
    # Warning: Expected 'collections.Iterable', got 'Type[Color]' instead
    print(color)

虽然方法 EnumMeta.__iter__ 存在,但 PyCharm 无法解决这个问题。

我不介意手动添加类型提示来解决这个问题,我只是不确定是什么和在哪里。

也许这不是最干净的解决方案,但以下对我有用:

from enum import Enum
import typing

class Color(Enum):
    RED = 0
    BLUE = 1

Color = Color  # type: typing.Union[typing.Type[Color], typing.Iterable]

PyCharm supports type hinting using format defined in PEP 484(Python 3.5以下版本以注释形式,3.5及以上版本以注释形式)。

这里要注意的是,在低于 3.5 的 Python 版本上,导入 typing 模块应该以某种方式加以保护(PyCharm 认为这个导入是有效的,即使没有 typing 模块安装在站点包中,但是当代码为 运行 时会出现 ImportError)。

我在 PyCharm 中使用的解决方法是将 __members__.items()

一起使用
from enum import Enum

class Color(Enum):
    RED = 0
    BLUE = 1

for name, color in Color.__members__.items():
    print(name, color)

返回:

('RED', <Color.RED: 0>)
('BLUE', <Color.BLUE: 1>)

参考以下link:

https://cpython-test-docs.readthedocs.io/en/latest/library/enum.html#iteration