mypy工具字面量类型检查出错

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

我在我的代码中集成了mypy工具,但是在字面量的类型检查中有错误 错误:“Optional[Type[Temp]]”的项目“None”没有属性“pankaj”[union-attr]

它总是将 b 视为 Optional[Type[Temp]] 但当它为真时它不应该是 Optional 并且当它为 false 时它是 Optional。但是它给出了 Optional[Type[Temp]]

的真假错误
    class Temp:
    @staticmethod
    def pankaj():
        print("pankaj")

def accepts_only_int(x: int) -> Union[tuple[Literal[True],Type[Temp]],tuple[Literal[False],Optional[Type[Temp]]]]:
    return (False,Temp)

a, b=accepts_only_int(6)

if a:
    print(b.pankaj())
else:
    print(a,b.pankaj())
python types mypy
1个回答
0
投票

mypy
无法跟踪多个变量的依赖关系,这是一个实现限制。要解决此问题,请不要解压
accepts_only_int
——将其分配给一个变量
a
并测试
if a[0]
。那么你不是在引用几个变量,而是通过联合中的项目类型来缩小元组。您可以稍后在条件分支中解压:

from typing import Literal

class Temp:
    @staticmethod
    def pankaj() -> None:
        print("pankaj")

def accepts_only_int(x: int) -> tuple[Literal[True], type[Temp]] | tuple[Literal[False], type[Temp] | None]:
    return (False, Temp)

a = accepts_only_int(6)

if a[0]:
    _, temp = a
    print(temp.pankaj())
else:
    print(a[0], a[1].pankaj())  # E: Item "None" of "Optional[Type[Temp]]" has no attribute "pankaj"  [union-attr]

正如预期的那样,这只有一个

mypy
错误。这是 游乐场链接.

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