繁体   English   中英

我如何告诉 MyPy 关于 os.path 的错误不是错误?

[英]How do I tell MyPy that errors about os.path are not errors?

在 VS Code 中,Problems 选项卡在使用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 解释器链接到 select 附带 Salome 的 python3.exe(并且运行此代码没有错误)。

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

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

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

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

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

kernel_root=os.environ["KERNEL_ROOT_DIR"]

MyPy 只是在做它应该做的事情: 键入检查你的代码并找到常见的错误。

在这种情况下,错误是有意义的,因为os.getenv(key, default=None)返回“环境变量键的值(如果存在,则返回默认值)。 ”。 如果KERNEL_ROOT_DIR环境变量,则os.path真实路径或join realpath将引发异常。

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

有几种方法。

方式一

您可以通过在该行上添加特殊的# 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"
]

在此处输入图像描述

如果您不关心查找特定的错误,而只想消除该行的所有错误,则可以删除[code]部分并执行# type: ignore

方式二

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

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

[mypy-myproject.config]
ignore_errors = True

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

[mypy]
disable_error_code = type-var

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

在此处输入图像描述

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM