PyCharm类型暗示枚举迭代

时间:2018-02-05 09:51:31

标签: python enums pycharm type-hinting

Python的枚举类支持迭代,但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很难解决这个问题。

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

2 个答案:

答案 0 :(得分:1)

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

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类型提示使用PEP 484中定义的格式(对于低于3.5版本的Python版本以注释形式,对于3.5版本及更高版本的注释形式)。

此处的重要说明是,在低于3.5的Python版本上,应以某种方式保护typing模块的导入(PyCharm认为此导入是有效的,即使未在站点软件包中安装typing模块,但是在运行代码时发生ImportError

答案 1 :(得分:0)

我在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>)

请参阅以下链接以供参考:

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