Python typehints和linters

时间:2016-11-24 08:26:00

标签: python python-3.x annotations lint type-hinting

我一直在为我们的python项目添加静态类型检查,例如:

from typing import List
from something import MyOtherClass

class MyClass:
    def __init__(self) -> None:
        self.some_var = None  # type: List[MyOtherClass]

但是,现在我们使用的linters(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]

有没有更好的解决方案来解决这个问题?我们不想禁用所有未使用的导入警告。

2 个答案:

答案 0 :(得分:3)

Python 3.6实现了PEP 526: Syntax for Variable Annotations,顾名思义为变量注释引入了新的语法,不再需要类型注释。

在新语法中,您的代码将被重写为:

from typing import List, Optional
from something import MyOtherClass

class MyClass:

    def __init__(self) -> None:
        self.some_var: Optional[List[MyOtherClass]] = None

......或者:

from typing import List, Optional
from something import MyOtherClass

class MyClass:

    some_var: Optional[List[MyOtherClass]]

    def __init__(self) -> None:
        self.some_var = None

由于ListMyOtherClass现在在代码中显示为实际代币,而不是评论,因此短信应该可以确定它们确实被使用了。

答案 1 :(得分:3)

@Zero Piraeus回答提供了最新的解决方案(即使用变量注释,另见:What are variable annotations in Python 3.6?)。

除此之外,当您使用List条评论时,甚至 都无法导入# type:。根据我的意识,mypy不要求导入它们,也不要导入pyflakespylint

除非您需要在Python实际执行名称查找的地方使用其名称,否则无需从typing导入名称(在评​​论中,这不是必需的。)