mypy 在字典中出现条件可选整数错误

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

我正在尝试向我的代码之一添加类型提示。我正在使用 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 不够聪明,无法意识到这一点?

python mypy
1个回答
0
投票

据我所知,

mypy
和PyRight都无法为
int1
int2
分配静态类型来区分联合的两侧。就目前而言,两个都可以是
int|None
,因此知道
int1
None
并不意味着not对检查者意味着
int2
不是
None
。 (非常粗略地说,您需要对 sum 或 union 类型进行 XOR 模拟,以便可以断言 int1int2
either
,但不能断言
both
可以为其分配
Optional
类型.

我不知道(或者至少没有想到)该问题的解决方法。我可能会考虑对

dict
进行标准化,以便非
None
值始终位于第一位,如果这不会干扰元组的含义的话。

© www.soinside.com 2019 - 2024. All rights reserved.