【问题标题】:How do I tell MyPy that errors about os.path are not errors?我如何告诉 MyPy 关于 os.path 的错误不是错误?
【发布时间】:2021-01-02 02:30:37
【问题描述】:

在 VS Code 中,使用 os.path.join 时,Problems 选项卡显示错误,但代码实际运行。我如何告诉 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]

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

【问题讨论】:

  • 我找到了一个解决方法:在vs代码设置下,搜索“linting”并关闭所有linter,然后从Microsoft安装pylance,即使它没有在“linting”下列出,它也会执行linting " 设置:并且 pylance 似乎没有将这些非错误标记为错误(到目前为止)。

标签: python visual-studio-code mypy


【解决方案1】:

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

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

kernel_root=os.environ["KERNEL_ROOT_DIR"]

【讨论】:

    【解决方案2】:

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

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

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

    有几种方法。

    方式 1

    您可以通过在该行上添加一个特殊的# type: ignore[code] 注释来使 那些特定行/s 上的 该特定错误 静音:

    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]
    

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

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

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

    方式 2

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

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

    [mypy-myproject.config]
    ignore_errors = True
    

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

    [mypy]
    disable_error_code = type-var
    

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-24
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2013-07-25
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      相关资源
      最近更新 更多