【发布时间】:2021-10-02 08:36:06
【问题描述】:
假设我有一个协议Foo。
from typing import Protocol, Optional
class Foo(Protocol):
val: Optional[int]
还有一个类似下面的函数:
def func(obj: Foo) -> None:
if obj.val is not None:
print(obj.val)
我希望ImplA 和ImplB(如下所示)应该是func 可接受的参数,因为val: int 比val: Optional[int] 更具体。
class ImplA:
val: int
class ImplB:
val: Optional[int]
a = ImplA()
b = ImplB()
func(a) # It works
func(b) # Argument 1 to "func" has incompatible type "ImplB"; expected "Foo"
由于它不起作用,我必须定义 Bar 并取两个类的并集。但是,有没有办法构造一个协议,使得val: Optional[int] 和val: int 在没有Union 的情况下都被接受?
class Bar(Protocol):
val: int
def func(obj: Union[Foo, Bar]): ...
编辑:
为此,我们需要确保 val 的类型是协变的。就我现在所见,Protocol 似乎将其定义为不变量。这样就无法达到我的要求了吗?
【问题讨论】:
标签: python protocols type-hinting python-typing duck-typing