Ответ 1
Вы ищете 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) # doesnt typecheck because f.value is only a Callable