考虑:
from dataclasses import dataclass
from uuid import UUID
from enum import Enum
class E(Enum):
m = "m"
@dataclass
class A:
e: str | E
a = A(E.m)
def f(x: str) -> None:
print(x)
if a.e != E.m:
f(a.e)
在
--strict
模式下运行 Mypy 不会报告任何错误,因为它正确地推断出 a.e
的类型只能是 str
(如果它不是 E.m
)。但是将 str
更改为例如a UUID
,即
@dataclass
class A:
e: UUID | E
def f(x: UUID) -> None:
print(x)
导致Mypy报告:
bug.py:18: error: Argument 1 to "f" has incompatible type "UUID | E"; expected "UUID" [arg-type]
Found 1 error in 1 file (checked 1 source file)
是否有逻辑原因允许推断一种情况下所述的
a.e
的类型,但不能推断另一种情况,或者这是 Mypy 中的错误?
这是因为
UUID
重载了 __eq__
。来自typeshed/stdlib/uuid.py
:
class UUID:
# ...
def __eq__(self, other: object) -> bool: ...
使用
is not
解决了问题:
(游乐场)
if (m := a.e) is not E.m:
f(m) # fine