我有以下代码
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"
(意味着第二个过载对于这种情况无论如何都是不正确的)
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:
...