首页 > 编程问答 >Python 类型提示和 linter

Python 类型提示和 linter

时间:2024-07-23 13:05:57浏览次数:13  
标签:python python-typing pylint flake8

我一直在向我们的 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 規則。這確保了你可以在保持乾淨程式碼庫的同時受益於靜態型別檢查。

标签:python,python-typing,pylint,flake8
From: 40781249

相关文章

  • eclipse如何写python程序
    本文主要介绍在Windows系统环境下,搭建能在Eclipse中运行python程序的环境。一、Eclipse下载与安装:Eclipse是写JAVA的IDE,下载地址为:http://www.eclipse.org/downloads/下载安装,网上教程很多,不赘述。二、pydev插件下载与安装:启动Eclipse,点击Help—>EclipseMarketplace......
  • 运行 python 3 代码时出现 python 2 语法错误
    我有一个如下所示的类classExperimentResult(BaseDataObject):def__init__(self,result_type:str,data:dict,references:list):super().__init__()self.type=result_typeself.references=referencesself.data=data......
  • 如何让 python 类型检查器知道它应该返回其类的新实例?
    我想使用classmethod返回当前类的新实例,并且我尝试了如下代码,但它引发了NameError('name'T'isnotDefined')PutthecodeT=TypeVar('T',bound=A)on|||以上也不起作用。classA有什么好主意来处理它吗?Isthereanygoodideatohandleit?......
  • 由于循环依赖而导致的Python注释错误
    我有两个相互依赖的类,并且无需注释即可正常工作。不幸的是,当我尝试注释返回值时,它会导致预期循环依赖错误。Network.pydefprocessors(self)->List[Processor]:#implementationProcessor.pydefnetwork(self)->Network:......
  • 如何在python中发送带有请求的“multipart/form-data”?
    如何在Python中使用multipart/form-data发送requests?如何发送文件,我明白,但是如何通过这种方法发送表单数据无法理解。可以使用Python中的requests库来发送multipart/form-data请求。说得对,requests库可以轻松发送文件,并且发......
  • 我安装了哪个版本的 Python?
    我必须在Windows服务器上运行Python脚本。我如何知道我拥有哪个版本的Python,这真的很重要吗?我正在考虑更新到最新版本的Python。确定在Windows服务器上安装的Python版本至关重要,因为它可以确定脚本的兼容性和可用库。以下是检查方法:使用命令提......
  • @classmethod 在 Python 的类之外做什么?
    在下面的代码中,如果存在@classmethod注释,则允许内部defnew()代替目标的__new__()--但该类会传递两次。如果@classmethod被删除,那么我们会收到类似“”的错误。@classmethod这里在做什么,有没有办法不用它?(我的动机是清晰的:我不理......
  • 三种语言实现快速选择(C++/Python/Java)
    题目给定一个长度为......
  • 如何让SublimeText支持Python 3的注释?
    我测试了SublimeText2和3,两者都有错误:如果您测试此代码,您会注意到:之后的所有代码都不会正确突出显示语法。deffoo(a,b)->str:#Nothinggetsproperlycoloredfromhere#Abunchofcode…return"bar"我发现了一些链接,解释了如何......
  • 如何用可变长度注释Python列表
    如何为可变长度或None的Python列表编写注释?当我这样写时,它会返回一个错误。defsome_function(params:list[str,...])#thisgiveserror:`TypeError:'type'objectisnotsubscriptable`defsome_function(params:List[str,...])#thisalsogiveserro......