通过对单成员枚举进行不平等检查来缩小类型仅适用于某些类型的联合

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

考虑:

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 中的错误?

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

这是因为

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
© www.soinside.com 2019 - 2024. All rights reserved.