我如何告诉 MyPy 有关 os.path 的错误不是错误? 方式 1方式 2

问题描述

在 VS Code 中,“问题”选项卡在使用 os.path.join显示错误,但代码实际运行。我如何告诉 MyPy 这些不是错误

我在 Salome 平台上工作,运行的现有代码显示以下错误:(具体程序是 envSalome.py,它是启动整个 Salome-meca 节目的程序):>

import os

kernel_root=os.getenv("KERNEL_ROOT_DIR")
kernel_root = os.path.realpath(kernel_root)                 # this is line 39 in the error below
sys.path[:0]=[os.path.join(kernel_root,"bin","salome")]     # this is line 40 in the error below

这个程序运行没有错误

我使用了 VS Code 左下角的 python 解释器链接来选择与 Salome 一起提供的 python3.exe(并且运行此代码没有错误)。

我的问题:
在终端窗口的“问题”选项卡中,MyPy 显示以下错误

“realpath”的类型变量“AnyStr”的值不能是“Optional[str]”mypy(error) [39,16]

“join”的参数 1 具有不兼容的类型“Optional[str]”;预期“Union[str,_PathLike[str]]”mypy(error) [40,29]

解决方法

os.getenv("KERNEL_ROOT_DIR") 可能返回 strNone。您没有考虑到这一点,mypy 告诉您,当它返回 None 时,您没有涵盖这种情况。

如果您希望该值始终存在于环境中,我建议使用不返回 None 的函数,例如

kernel_root=os.environ["KERNEL_ROOT_DIR"]
,

MyPy 只是在做它应该做的事情:"type check your code and find common bugs."

在这种情况下,错误是有道理的,因为 os.getenv(key,default=None) 返回“环境变量键的值(如果存在,否则为默认值)。”。如果未定义 KERNEL_ROOT_DIR 环境变量,os.path realpathjoin 函数将引发异常。

如果您100% 确定 KERNEL_ROOT_DIR 变量将始终存在于您将运行此代码的环境中,您可以告诉 MyPy 忽略这些错误。 (我们告诉 MyPy 忽略它们,因为 MyPy 无法了解您的 Salome 平台或了解它们不是错误。)

有几种方法。

方式 1

您可以通过在该行添加特殊的 # type: ignore[code] 注释来消除那些特定行上的该特定错误

kernel_root = os.getenv("KERNEL_ROOT_DIR")
kernel_root = os.path.realpath(kernel_root)  # type: ignore[type-var]
sys.path[:0] = [os.path.join(kernel_root,"bin","salome")]  # type: ignore[arg-type]

要在 VS Code 的问题选项卡上显示确切的 MyPy 错误代码,请将以下内容添加到您的 settings.json

"python.linting.mypyArgs": [
    "--show-error-codes"
]

enter image description here

如果您不关心查找特定错误,而只想消除该行的所有错误,您可以删除 [code] 部分,然后执行 { {1}}。

方式 2

如果您可以将这些行隔离到特定模块中,则可以告诉 MyPy 忽略该特定模块的所有错误。这可以通过创建一个 MyPy configuration file 来完成,它是一个 mypy.ini 或一个 .mypy.ini 或一个 setup.cfg > 文件放在工作区的根目录下,然后添加 ignore_errors 选项。

例如,如果这些行是 myproject 包内的模块 config.py 的一部分,则拥有此 MyPy 配置文件将消除这些错误:

# type: ignore

如果您只想忽略配置文件中的特定错误代码,可以使用 disable_error_code 选项,但它只是一个全局设置

[mypy-myproject.config]
ignore_errors = True

上面的示例忽略了其中一个错误:

enter image description here

但请注意,这也会忽略同一模块其他行上的其他错误