from typing import overload, NamedTuple
class A(NamedTuple):
pass
class B(NamedTuple):
pass
@overload
def frobnicate(arg: A) -> A: ...
@overload
def frobnicate(arg: B) -> B: ...
def frobnicate(arg: A | B) -> A | B:
if isinstance(arg, A):
return A()
elif isinstance(arg, B):
return B()
else:
raise TypeError()
该代码使Mypy发出:
error: Overloaded function signatures 1 and 2 overlap with incompatible return types [overload-overlap]
播放它:https://mypy-play.net/?mypy =最新&python = 3.12&gist =38e025ef049b6a1121cdd92c9998e844a9 this是在从
NamedTuple
或
tuple
或dict
或object
A | B
继承时专门发生的。
我应该在mypy上提出问题,还是由于我不考虑的事情而引起的预期行为?
A
,则返回类型为
A
,并且对于B
。您可以使用通用TypeVar
指定此约束:from typing import overload, NamedTuple
class A(NamedTuple):
pass
class B(NamedTuple):
pass
from typing import TypeVar
T = TypeVar("T", A, B)
def frobnicate(arg: T) -> T:
return arg