簡體   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