Вы ищете bound
:
T = TypeVar('T', bound=Callable)
С Документы :
переменная типа может указывать верхнюю границу, используя 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