【发布时间】:2023-02-16 21:31:25
【问题描述】:
我正在寻找但无法找到一种简洁的方式来表示类型提示obj: "subclass of A and B"。类型提示 obj: typing.Union[A, B] 不涵盖这种情况,因为它将接受 A 的实例或者B 或其任何子类。
我正在写一个可以由类实现的protocol。
这个接口有一个 __eq__ 方法,可以比较实现这个协议的同一个类的多个实例。通过实现这个协议,类获得了__eq__方法的默认实现。
import typing
@typing.runtime_checkable
class MyInterface(typing.Protocol):
def __eq__(o1, o2) -> bool:
''' checks if `o1` and `o2` are equal to one another '''
from random import randint
return bool(randint(0,1)) # TODO: write a better implementation
...
我想添加类型提示来表示 1. __eq__ 的两个对象必须是同一类的实例和2. 必须执行MyProtocol。
以下是我考虑过的事情:
- 可以像这样定义一个类型变量:
T = typing.TypeVar('T')并在签名中使用它:
def __eq__(o1: T, o2: T) -> bool:
但是,这并不强制实施 MyProtocol。
- 我可以改为明确协议:
def __eq__(o1: 'MyProtocol', o2: 'MyProtocol') -> bool:
然而,这并不能阻止静态类型成为两个不同的类层次结构,没有共享结构,它们都实现了一个协议(例如,BankAccount实现了HasOpen,Door实现了HasOpen)。
实现这一目标的好方法是什么?
【问题讨论】:
-
Pythons 类型系统不支持交集类型
标签: python types python-typing static-typing