如何输入注释可选类类型参数

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

我有以下代码

from typing import TypeVar, Type, overload

T = TypeVar('T')


@overload
def foo(bar: Type[T]) -> T:
    ...

@overload
def foo(bar: Type[T] | None) -> T | None:
    ...


def foo(bar: Type[T] | None) -> T | None:
    # implementation goes here
    ...


class Bar:
    ...


bar = foo(Bar)
bar2 = foo(Bar | None)  # No overload variant of "foo" matches argument type "UnionType"

如何正确输入

bar2
的提示案例?


我尝试了其他一些:

Type[T | None]
,mypy 说
Overloaded function signature 2 will never be matched: signature 1's parameter type(s) are the same or broader

删除第二个过载(导致只允许

Type[T]
),mypy说
No overload variant of "foo" matches argument type "UnionType"
(意味着第二个过载对于这种情况无论如何都是不正确的)

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

type[T]
意味着可以调用来检索
T
类型的实例。
type[T] | None
就是这样的意思,或者
None
;因此,
bar
可能是可调用的。

但是,

Bar | None
在运行时返回
UnionType
的实例,并且此类对象无法被调用。

您似乎想要提议的

TypeForm
,到目前为止,它仅存在于 PEP 草案中:

@overload
def foo[T](bar: TypeForm[type[T]]) -> T:
    ...

@overload
def foo[T](bar: TypeForm[type[T] | None]) -> T | None:
    ...

def foo[T](bar: TypeForm[type[T] | None]) -> T | None:
    ...
© www.soinside.com 2019 - 2024. All rights reserved.