我一直在为我们的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]
有没有更好的解决方案来解决这个问题?我们不想禁用所有未使用的导入警告。
答案 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
由于List
和MyOtherClass
现在在代码中显示为实际代币,而不是评论,因此短信应该可以确定它们确实被使用了。
答案 1 :(得分:3)
@Zero Piraeus回答提供了最新的解决方案(即使用变量注释,另见:What are variable annotations in Python 3.6?)。
除此之外,当您使用List
条评论时,甚至 都无法导入# type:
。根据我的意识,mypy
不要求导入它们,也不要导入pyflakes
或pylint
。
除非您需要在Python实际执行名称查找的地方使用其名称,否则无需从typing
导入名称(在评论中,这不是必需的。)