检查枚举子类的特定实现的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

这是什么:

这是一个很小的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_namepretty_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插件将引发错误。

作者

Christopher Sabater Cordero

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用JNA创建同一库的多个实例?   java在将Graphql查询作为JSON字符串传递时收到意外的令牌错误   OAuth2 oltu的java问题   java桌面应用程序使用的好的嵌入式数据库是什么?   java Firebase数据库高级查询选项   java正在使磁盘上的EhCache元素过期   java 安卓还原处于backstack中的片段的实例状态   XMemcached中的java异步集   java TimescaleDB是否使用与Postgresql完全相同的JDBC驱动程序?   java从网站c读取信息#   检查java Android中的字符串是否只包含数字和空格   c#如何向web服务发送特殊字符?   grails无法调用需要java的方法。lang.类参数?   java我在组合框中调用的方法不会运行所有代码,它只运行部分代码   java发送带有标头的HTTP GET请求