我一直在向我们的 python 项目添加静态类型检查,例如像这样:
from typing import List
from something import MyOtherClass
class MyClass:
def __init__(self) -> None:
self.some_var = None # type: List[MyOtherClass]
但是,现在我们使用的 linter(flake8 和 pylint)报告为
List
作为未使用的变量,因为它们在实际代码中没有使用。 (顺便说一下,pep8 处理得很好)。
所以我们最终将代码更改为:
from typing import List # noqa # pylint: disable=unused-import
from something import MyOtherClass # noqa # pylint: disable=unused-import
class MyClass:
def __init__(self) -> None:
self.some_var = None # type: List[MyOtherClass]
有没有更好的解决方案来解决这个问题?我们不想禁用所有未使用的导入警告。
你有幾個選項可以解決 Python 類型提示中的 linter 警告,而無需針對每個匯入都停用未使用的匯入規則:
1. 使用註解型別提示(適用於 Python 3.9+):
如果你使用的是 Python 3.9 或更新版本,你可以使用註解型別提示,這完全不需要匯入
typing
模組,從而避免了 linter 警告。例如:
```python from something import MyOtherClass
class MyClass: def init (self) -> None: self.some_var: list[MyOtherClass] = None ```
2. 為你的 linter 設定檔:
-
Flake8: Flake8 本身並不檢查型別提示,它依賴其他工具(例如
pyflakes
)。你可以設定 flake8 以忽略來自特定錯誤碼的訊息。若要忽略F401
(「匯入『typing』未使用」),請將以下內容新增至你的.flake8
設定檔:ini [flake8] ignore = F401
你也可以在setup.cfg
檔案中設定:[flake8] ignore = F401
-
Pylint: 你可以在 pylint 設定檔(
.pylintrc
或pyproject.toml
) 中停用unused-import
訊息。若要僅針對typing
匯入停用它,請使用:ini [TYPECHECK] ignored-modules = typing
或者,在pyproject.toml
中:toml [tool.pylint."TYPECHECK"] ignored-modules = ["typing"]
3. 使用型別檢查器進行單獨的步驟:
將 linting 和型別檢查視為獨立的步驟。使用像
mypy
這樣的專用型別檢查器來驗證你的型別提示。這允許 linter 專注於程式碼樣式和潛在錯誤,而型別檢查器則處理型別一致性。
你可以在你的 CI/CD 管線中整合 mypy,以在不影響 linting 的情況下強制執行型別檢查。
4. 忽略包含型別提示的特定行:
雖然不建議這樣做,但你可以使用
# noqa
或 linter 特定的註解(例如
# pylint: disable=unused-import
)忽略包含型別提示的特定行。但是,這種方法可能會導致程式碼難以閱讀,並且應該謹慎使用。
總體而言,
建議的解決方案是使用註解型別提示(如果可能)或為你的 linter 設定適當的設定
,以處理
typing
匯入,而無需完全停用
unused-import
規則。這確保了你可以在保持乾淨程式碼庫的同時受益於靜態型別檢查。