我正在尝试向我的代码之一添加类型提示。我正在使用 mypy 检查代码中声明的类型是否一致。但是,我发现了以下情况,不知道如何解决: 我有一本相当复杂的字典,通常有类型
dict[tuple[tuple[int, int], str], str]
但是,在某些情况下,int
值可能会丢失并且为 None。但至少两者之一都会在那里。因此,我将字典声明为
dict[
tuple[
Union[
tuple[Optional[int], int],
tuple[int, Optional[int]]],
str],
str]
但是,这似乎不适用于 mypy,因为我有以下代码:
for (int1, int2), str in dict:
if int1 is None:
int2 + 3
else:
...
并且 mypy 为我提供了“int2 + 3”行的以下输出:
error: Unsupported operand types for + ("None" and "int") [operator]
note: Left operand is of type "int | None"
我知道代码正在运行,因为 int1 和 int2 不可能同时为 None 。因此,由于该行仅当 int1 为 None 时才会运行,因此 int2 保证是 int。 我的类型提示错误吗?或者只是 mypy 不够聪明,无法意识到这一点?
据我所知,
mypy
和PyRight都无法为int1
和int2
分配静态类型来区分联合的两侧。就目前而言,两个都可以是int|None
,因此知道int1
是None
并不意味着not对检查者意味着int2
不是None
。 (非常粗略地说,您需要对 sum 或 union 类型进行 XOR 模拟,以便可以断言 int1
和 int2
的 either,但不能断言
both可以为其分配
Optional
类型.
我不知道(或者至少没有想到)该问题的解决方法。我可能会考虑对
dict
进行标准化,以便非 None
值始终位于第一位,如果这不会干扰元组的含义的话。