元组的实例在枚举中没有成员(pylint 无成员)class
Instance of tuple has no member (pylint no-member) in enum class
在使用枚举 class 中的成员 "value" 和 "equals" 时,我从 pylint 收到以下错误:
"code": "no-member"
"message": "Instance of 'tuple' has no 'value' member"
版本:
皮林特2.3.1
小行星 2.2.5
Python3.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”注释来禁用警告,但我不想这样做...将 class 列入白名单也是如此因为我仍然希望 pylint 报告其他发现。
回答你的主要问题:
pylint
doesn't recognize 动态创建的属性,并且
Enum
在 number of ways 中是 "special",其中之一是 Enum 的成员实际上是 enum
class 的实例:
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'>
也就是说,当您在 GlobalEnum
class 中设置 TRUE
时,Python 会将 TRUE
转换为 GlobalEnum
的实例, 但 pylint 不理解这一点,并且由于它看起来像 GlobalEnum.TRUE
被分配了一个元组值,pylint 认为它是一个元组,它没有 "value" 成员。
要回答是否有更多 "pythonic" 方法可以达到相同的结果,我不确定您想要完成什么,但看起来您正在做一些奇怪的事情。例如:
__new__()
被传递给 class 作为它的第一个参数,但是你称它为 "self," by (near-)universal convention 指的是 instance,读起来很混乱。通常人们会称它为 cls
.
单前导下划线(“_name
”、“_type
”)通常用于表示 "private" 成员,因此会造成混淆大多数读者可以在函数签名中使用它们。如果要使用保留字作为参数名称,常见约定是使用尾部下划线(例如,“type_
”、“exec_
”)。
我不确定你想用你的“_type
”属性完成什么,但现在 GlobalEnum.TRUE
和 GlobalEnum.FALSE
都会 return 一个空字符串作为它们的 _type
,因为 str()
return 是一个字符串实例,如果没有 args,字符串将为空。如果你想return str
类型,你应该将它设置为str
(没有括号)。
I think 你想要做的是创建一个枚举,当与一个 int 或一个字符串比较时,其值将评估为 True您在定义中指定。在这种情况下,您可以覆盖内置的 __eq__()
魔术方法,而不是用户定义的 equals()
方法(您几乎肯定会在某些时候忘记使用它),以便您可以使用通常的 ==
运算符代替:
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
只是一个普通的class属性,意思是可以设置。要使其成为只读的,您可以使用不带 setter 的 property decorator。]
在使用枚举 class 中的成员 "value" 和 "equals" 时,我从 pylint 收到以下错误: "code": "no-member" "message": "Instance of 'tuple' has no 'value' member" 版本: 皮林特2.3.1 小行星 2.2.5 Python3.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”注释来禁用警告,但我不想这样做...将 class 列入白名单也是如此因为我仍然希望 pylint 报告其他发现。
回答你的主要问题:
pylint
doesn't recognize 动态创建的属性,并且Enum
在 number of ways 中是 "special",其中之一是 Enum 的成员实际上是enum
class 的实例:
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'>
也就是说,当您在 GlobalEnum
class 中设置 TRUE
时,Python 会将 TRUE
转换为 GlobalEnum
的实例, 但 pylint 不理解这一点,并且由于它看起来像 GlobalEnum.TRUE
被分配了一个元组值,pylint 认为它是一个元组,它没有 "value" 成员。
要回答是否有更多 "pythonic" 方法可以达到相同的结果,我不确定您想要完成什么,但看起来您正在做一些奇怪的事情。例如:
__new__()
被传递给 class 作为它的第一个参数,但是你称它为 "self," by (near-)universal convention 指的是 instance,读起来很混乱。通常人们会称它为cls
.单前导下划线(“
_name
”、“_type
”)通常用于表示 "private" 成员,因此会造成混淆大多数读者可以在函数签名中使用它们。如果要使用保留字作为参数名称,常见约定是使用尾部下划线(例如,“type_
”、“exec_
”)。我不确定你想用你的“
_type
”属性完成什么,但现在GlobalEnum.TRUE
和GlobalEnum.FALSE
都会 return 一个空字符串作为它们的_type
,因为str()
return 是一个字符串实例,如果没有 args,字符串将为空。如果你想returnstr
类型,你应该将它设置为str
(没有括号)。I think 你想要做的是创建一个枚举,当与一个 int 或一个字符串比较时,其值将评估为 True您在定义中指定。在这种情况下,您可以覆盖内置的
__eq__()
魔术方法,而不是用户定义的equals()
方法(您几乎肯定会在某些时候忘记使用它),以便您可以使用通常的==
运算符代替:
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
只是一个普通的class属性,意思是可以设置。要使其成为只读的,您可以使用不带 setter 的 property decorator。]