如何设置默认类型的typehint

问题描述 投票:0回答:1

在这种情况下我正在尝试为默认类型设置正确的类型提示

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:
                             ^~~

python mypy python-typing type-variables
1个回答
0
投票

不要让这个问题得不到解答:为了让

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 链接

© www.soinside.com 2019 - 2024. All rights reserved.