元组的实例在枚举类中没有成员(pylint没有成员)

时间:2019-08-21 07:17:21

标签: python python-3.x enums pylint

当从枚举类中使用成员“值”和“等于”时,我从pylint收到以下错误:     “代码”:“无成员”     “ message”:“'tuple'的实例没有'value'成员” 版本: 铅2.3.1 星形2.2.5 Python 3.6.3

代码按预期执行。我只是想知道是否可能我做错了什么(我不是专业的python程序员),或者是否有更“ pythonic”的方式来实现相同的结果:

from enum import Enum

class DefaultEnum(Enum):

    def __new__(self,val,_name,_type):
        obj = object.__new__(self)
        obj._value_ = val
        obj._publicName = _name
        obj._type = _type
        return obj

    def __str__(self):
        return self._publicName

    def equals(self,_string):
        return _string == str(self)

class GlobalEnum(DefaultEnum):
    TRUE = 0,'True',str()
    FALSE = 1,'False',str()


GlobalEnum.TRUE.value
>> 0
GlobalEnum.TRUE.equals('True')
>> True
repr(GlobalEnum.TRUE)
>> <GlobalEnum.TRUE: 0>

我当前正在使用“#pylint:disable = no-member”注释来禁用警告,但是我不希望这样做...将类列入白名单的方法与我仍然想要的pylint相同。报告其他发现。

1 个答案:

答案 0 :(得分:8)

要回答您的主要问题:

  1. pylint doesn't recognize动态创建的属性,以及
  2. Enumnumber of ways中是“特殊”的,其中之一是Enum的成员实际上是enum类的实例:
    from enum import Enum

    class MyEnum(Enum):
        val1 = 0

    print(type(MyEnum.val1)) # <enum 'MyEnum'>


    class MyClass:
        val1 = 0

    print(type(MyClass.val1)) # <class 'int'>

也就是说,当您在TRUE类中设置GlobalEnum时,Python会将TRUE转换为GlobalEnum的实例,但是pylint不理解这一点,并且因为看起来GlobalEnum.TRUE被分配了一个元组值,所以pylint认为它是一个元组,没有“值”成员。

要回答是否有更“ pythonic”的方式来达到相同的结果,我不确定您要完成什么,但是看起来您正在做一些奇怪的事情。例如:

  1. __new__()传递了一个 class 作为其第一个参数,但是您将其称为“ self”,按照(近)通用惯例,它称为 instance ,这很容易阅读。通常,人们会称其为cls

  2. 按惯例,单引号下划线(“ _name,” _type“)通常用于表示“私有”成员,因此大多数读者都难以使用它们在函数签名中。如果要使用保留字作为参数名称,通常的约定是使用结尾的下划线(例如“ type_”,“ exec_”)。

  3. 我不确定您要使用“ _type”属性来做什么,但是现在GlobalEnum.TRUEGlobalEnum.FALSE都将返回一个空字符串,如下所示:他们的_type,因为str()返回一个字符串实例,并且没有args的字符串将为空。如果希望它返回str 类型,则应将其设置为str(不带括号)。

  4. I 您想做的是创建一个枚举,与您在定义中指定的int或字符串相比,该枚举的值将为True。在这种情况下,您可以覆盖内置的equals()魔术方法,而不是用户定义的__eq__()方法(您几乎肯定会忘记使用它)。通常使用==运算符:

from enum import Enum


class BaseEnum(Enum):

    def __init__(self, int_value, str_value):
        self._value_ = int_value
        self.str_value = str_value

    def __eq__(self, other):
        return other == self.value or other == self.str_value


class MyEnum(BaseEnum):
    TRUE = 0, 'True'
    FALSE = 1, 'False'


print(MyEnum.TRUE == 0)  # True
print(MyEnum.TRUE == 'True')  # True
a = MyEnum.TRUE
print(a == MyEnum.TRUE) # True

print(MyEnum.TRUE.value)  # 0
print(MyEnum.TRUE.str_value)  # 'True'

[请注意,上面的str_value只是一个常规的类属性,意味着可以对其进行设置。要使其为只读,可以使用不带setter的property decorator。]