假设您想约束一个类型变量来实现某个接口。你可能会这样写:
from typing import TypeVar, Callable
T = TypeVar('T', Callable)
class Foo(Generic[T]):
...
>> TypeError: A single constraint is not allowed
为什么Python对这种类型约束的使用不满意? PEP 484和Python source code在这方面无益。
注意:在我的特定情况下,我感兴趣的是约束一个类型变量来实现一个抽象基类,但原理是相同的。
答案 0 :(得分:8)
您正在寻找bound
:
T = TypeVar('T', bound=Callable)
来自the docs:
类型变量可以使用
bound=<type>
指定上限。这意味着类型变量替换(显式或隐式)的实际类型必须是边界类型的子类,请参阅PEP 484.
TypeVar(name, *args)
表示该类型必须是args
之一,因此如果允许T
,Callable
的所有实例都可由T = TypeVar('T', Callable)
替换
你应该能够看到这里的差异(虽然我实际上没有尝试过,呵呵):
from typing import Generic, TypeVar, Callable
T = TypeVar('T', Callable, bool)
class Foo(Generic[T]):
value: T
def __init__(self, value: T) -> None:
self.value = value
class Bar:
baz = 5
def __call__(self):
pass
f = Foo(Bar())
print(f.value.baz) # doesn’t typecheck because f.value is only a Callable
答案 1 :(得分:0)
约束用户名必须为int
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)