检查枚举子类的特定实现的Pylint插件。
pylint-enums的Python项目详细描述
Pylint枚举
安装:
$ pip install pylint_enums # a conventional option
$ pipenv install pylint_enums # a more modern option
用法:
- 按照说明添加
pylint_enums
作为加载的插件的一部分。- 选项1(.pylintrc)
- 将
load-plugins=pylint_enums
添加到.pylintrc
中。 - 正常使用pylint,即
$ pylint [filepath]
- 将
- 选项2(命令行选项)
$ pylint [filepath] --load-plugins=pylint_enums
- 选项1(.pylintrc)
这是什么:
这是一个很小的pylint插件,它为枚举子类添加了一个检查器。当您没有为value
属性提供类型化批注,并且当类型批注不是简单类型的有限列表的一部分时,没有为枚举定义__str__
方法时,它会发出警告。
__str__
声明对以下类型不强制:
str
int
decimal
float
为什么这有帮助:
通常,枚举的值无关紧要。
from enum import Enum
class Foo(Enum):
FIRST = 'these'
SECOND = 'usually'
THIRD = 'don\'t'
FOURTH = 'matter'
但是,在某些应用程序和/或用例中,您实际上关心每个枚举成员的值。具体来说,您可以将它们用作向用户显示的verbose_name
或pretty_name
,或者您可能希望为其分配一个有状态值并在以后使用其内容。
from enum import Enum
from typing import NamedTuple
class FooMember(NamedTuple):
label: str
rank: int
class Foo(Enum):
FIRST = FooMember(label='first', rank=1)
SECOND = FooMember(label='second', rank=2)
THIRD = FooMember(label='third', rank=3)
FOURTH = FooMember(label='fourth', rank=4)
def __str__(self) -> str:
return self.value.label
在撰写本文时,mypy==0.600
无法推断成员值的类型。他们决心'Any'
:
reveal_type(Foo) # 'def (value: Any) -> foo.Foo'
reveal_type(Foo.FIRST) # 'foo.Foo'
reveal_type(Foo.FIRST.value) # 'Any'
对于依赖类型提示来维护其代码基的mypy
用户来说,这可能有问题。当您编写一个返回Foo.FIRST.value
的函数时,我们的工具无法帮助我们确定这个值是str
、还是NamedTuple
,或者其他值。理想情况下,我们将向枚举添加其他类型提示:
class Foo(Enum):
value: FooMember
FIRST = FooMember(label='first', rank=1)
...
但遗憾的是,这需要开发人员提高警惕,记住要做到这一点。如果要在多个文件中维护多个枚举,那么确保它们和所有将来定义的枚举都具有足够的类型可能会很烦人。
当value
未被键入,并且当值被键入到某个复杂值并且枚举缺少__str__
方法时,此pylint插件将引发错误。