如何解决从抽象基类派生的类实例的 Python 类型注释
假设已经创建了一个抽象基类 MembershipClass
。多个类派生自抽象基类,例如FirstClass
、SecondClass
等
我希望在接受从 MembershipClass
派生的任何类作为参数的函数中使用类型注释。如果有少量派生类(比如 2 个),这应该可以工作:
from typing import Union
def MyFunc(membership_obj: Union[FirstClass,SecondClass]) -> None:
...
有没有办法为 membership_obj
创建类型提示,它本质上说它的类型是从 MembershipClass
派生的任何类,而不必在类型注释中指定每个可能的派生类?
我看到了两种可能的解决方案:
from typing import TypeVar
BaseType = TypeVar('BaseType',bound=MembershipClass)
def MyFunc(membership_obj: BaseType) -> None:
...
def MyFunc(membership_obj: MembershipClass) -> None:
...
这两种方法都可以接受吗?
解决方法
看起来两种解决方案都有效,尽管 mypy 消息略有不同。考虑以下示例(我已内联添加了 mypy 错误):
from abc import ABC
from typing import TypeVar
class Base(ABC):
pass
class Sub(Base):
pass
BaseType = TypeVar("BaseType",bound=Base)
def MyFunc(c: Base) -> None:
pass
def MyFunc2(c: BaseType) -> None:
pass
if __name__ == "__main__":
b = Base()
s = Sub()
MyFunc(b)
MyFunc(s)
MyFunc(3) # main.py:30: error: Argument 1 to "MyFunc" has incompatible type "int"; expected "Base"
MyFunc2(b)
MyFunc2(s)
MyFunc2(3) # main.py:34: error: Value of type variable "BaseType" of "MyFunc2" cannot be "int"
话虽如此,我认为第二种方法更具可读性和直观性。我认为 TypeVar
更适合 generics(这并不是说如果您愿意就不应使用它)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。