在python中获取类中的所有常量

sed*_*idw 8 python class constants python-2.7

我有一个类,主要用于定义其他类的公共常量.它看起来像下面这样:

class CommonNames(object):
    C1 = 'c1'
    C2 = 'c2'
    C3 = 'c3'
Run Code Online (Sandbox Code Playgroud)

我希望"pythonically"获得所有常量值.如果我使用CommonNames.__dict__.values()我得到那些值('c1'等等),但我得到其他的东西,如:

[<attribute '__dict__' of 'CommonNames' objects>,
 <attribute '__weakref__' of 'CommonNames' objects>,
 None]
Run Code Online (Sandbox Code Playgroud)

我不想要的.

我希望能够获取所有值,因为此代码将在以后更改,我希望其他地方了解这些更改.

Mar*_*ers 14

您必须通过过滤名称来明确过滤掉这些内容:

[value for name, value in vars(CommonNames).iteritems() if not name.startswith('_')]
Run Code Online (Sandbox Code Playgroud)

这会生成任何不以下划线开头的名称的值列表:

>>> class CommonNames(object):
...     C1 = 'c1'
...     C2 = 'c2'
...     C3 = 'c3'
... 
>>> [value for name, value in vars(CommonNames).iteritems() if not name.startswith('_')]
['c3', 'c2', 'c1']
Run Code Online (Sandbox Code Playgroud)

对于像这样的枚举,你最好使用添加到Python 3.4 的新enum34backport:enum

from enum import Enum

class CommonNames(Enum):
    C1 = 'c1'
    C2 = 'c2'
    C3 = 'c3'

values = [e.value for e in CommonNames]
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您尝试在 python3 中使用 Martijn 示例,则应该使用 items() 而不是 iteritmes(),因为它已被弃用

[value for name, value in vars(CommonNames).items() if not name.startswith('_')]
Run Code Online (Sandbox Code Playgroud)