【发布时间】:2021-09-30 13:36:16
【问题描述】:
我不喜欢从 Mypy 收到有关函数签名的投诉,但我不知道如何解决这个问题。
我正在构建一个包,供多个程序使用。我有一个 IntEnum 的子类(FWIW,称为 _Event),其中包含许多相关的属性和方法。 _Event 从不直接使用,因为它不包含任何成员,但是几个不同的程序使用不兼容的 _Event 子类(AlphaEvent、BetaEvent 等),它们定义了 Enum 的实际成员(即实际事件)。每个子类只有一个成员是通用的,碰巧它被称为 END。由于您不能使用成员对枚举进行子类化,因此它在每个子类中单独定义(因此 _Event 没有 END 成员,但存在 AlphaEvent.END 和 BetaEvent.END)。
我有几个使用 _Event 子类的函数。我有几个需要访问 END 成员的属性,但对所有实例都是通用的。所以它们包含一个签名:
def generic_event_func(events: _Event):
...
events.END.action = <expr>
MyPy 用"error: "_Event" has no attribute "END" 标记上面的最后一行代码
确实如此,但子类确实如此。如何注释函数签名以消除此错误?
【问题讨论】:
-
END对您拥有定义的所有子类都是通用的;它不一定对所有可能的子类都通用,这是mypy所抱怨的。 -
您需要一个确实提供
END属性本身的类型提示。
标签: python python-3.x enums type-annotation