在这种情况下我正在尝试为默认类型设置正确的类型提示
from typing import TypeVar
class Foo:
pass
class FooBar(Foo):
pass
T = ...
def baz(type_: type[T] = Foo) -> T:
return type_()
已经尝试使用
T = TypeVar("T", bound=Foo)
但是mypy说:
Incompatible default for argument "type_" (default has type "type[Foo]", argument has type "type[T]") [assignment]
def baz(type_: type[T] = Foo) -> T:
^~~
不要让这个问题得不到解答:为了让
mypy
满意带有默认值的typevar类型参数,由于这个开放问题,你需要
overload
定义。
在这种情况下,实现签名仅用于主体类型检查,因此它可以在任何地方使用类型变量的上限。外部呼叫者将看到您期望他们看到的内容
from typing import TypeVar, overload
class Foo:
pass
class FooBar(Foo):
pass
T = TypeVar('T', bound=Foo)
@overload
def baz() -> Foo: ...
@overload
def baz(type_: type[T]) -> T: ...
def baz(type_: type[Foo] = Foo) -> Foo:
return type_()
reveal_type(baz(Foo)) # N: Revealed type is "__main__.Foo"
reveal_type(baz()) # N: Revealed type is "__main__.Foo"
reveal_type(baz(FooBar)) # N: Revealed type is "__main__.FooBar"
这是此实现的 playground 链接。