只是看看在python中获取命名常量的方法。
class constant_list:
(A_CONSTANT, B_CONSTANT, C_CONSTANT) = range(3)
当然你可以像这样引用它:
constant_list.A_CONSTANT
我想你可以使用字典,使用字符串:
constant_dic = {
"A_CONSTANT" : 1,
"B_CONSTANT" : 2,
"C_CONSTANT" : 3,}
并像这样引用它:
constant_dic["A_CONSTANT"]
那么,我的问题很简单。有没有更好的方法呢?不是说这些不足或什么,只是好奇 - 我错过了任何其他常见的习语吗?
提前致谢。
答案 0 :(得分:19)
2.3或之后:
class Enumerate(object):
def __init__(self, names):
for number, name in enumerate(names.split()):
setattr(self, name, number)
使用:
codes = Enumerate('FOO BAR BAZ')
codes.BAZ
将为2,依此类推。
如果您只有2.2,请在此前面加上:
from __future__ import generators
def enumerate(iterable):
number = 0
for name in iterable:
yield number, name
number += 1
(这取自here )
答案 1 :(得分:2)
答案 2 :(得分:2)
constant_dic的替代构造:
constants = ["A_CONSTANT", "B_CONSTANT", "C_CONSTANT"]
constant_dic = dict([(c,i) for i, c in enumerate(constants)])
答案 3 :(得分:2)
以下行为就像一个“石头写在一起”的C类枚举 - 一旦定义,你就无法改变它,你只能读它的价值观。你也不能实例化它。您所要做的就是“import enum.py”并从Enum类派生。
# this is enum.py
class EnumException( Exception ):
pass
class Enum( object ):
class __metaclass__( type ):
def __setattr__( cls, name, value ):
raise EnumException("Can't set Enum class attribute!")
def __delattr__( cls, name ):
raise EnumException("Can't delete Enum class attribute!")
def __init__( self ):
raise EnumException("Enum cannot be instantiated!")
这是测试代码:
# this is testenum.py
from enum import *
class ExampleEnum( Enum ):
A=1
B=22
C=333
if __name__ == '__main__' :
print "ExampleEnum.A |%s|" % ExampleEnum.A
print "ExampleEnum.B |%s|" % ExampleEnum.B
print "ExampleEnum.C |%s|" % ExampleEnum.C
z = ExampleEnum.A
if z == ExampleEnum.A:
print "z is A"
try:
ExampleEnum.A = 4
print "ExampleEnum.A |%s| FAIL!" % ExampleEnum.A
except EnumException:
print "Can't change Enum.A (pass...)"
try:
del ExampleEnum.A
except EnumException:
print "Can't delete Enum.A (pass...)"
try:
bad = ExampleEnum()
except EnumException:
print "Can't instantiate Enum (pass...)"
答案 4 :(得分:2)
这是我见过的最好的:“Python中的头等级枚举”
http://code.activestate.com/recipes/413486/
它为您提供了一个类,该类包含所有枚举。枚举可以相互比较,但没有任何特定的价值;你不能将它们用作整数值。 (我一开始就反对这个,因为我习惯于C枚举,它是整数值。但是如果你不能将它用作整数,你就不能将它作为整数错误地用作所以总的来说,我认为这是一场胜利。)每个枚举都是一个独特的对象。你可以打印枚举,你可以迭代它们,你可以测试枚举值是否在枚举中“。它非常完整和光滑。
答案 5 :(得分:1)
在Python中,字符串是不可变的,因此它们对于常量而不是数字更好。在我看来,最好的方法是创建一个将常量保持为字符串的对象:
class Enumeration(object):
def __init__(self, possibilities):
self.possibilities = set(possibilities.split())
def all(self):
return sorted(self.possibilities)
def __getattr__(self, name):
if name in self.possibilities:
return name
raise AttributeError("Invalid constant: %s" % name)
然后您可以像这样使用它:
>>> enum = Enumeration("FOO BAR")
>>> print enum.all()
['BAR', 'FOO']
>>> print enum.FOO
FOO
>>> print enum.FOOBAR
Traceback (most recent call last):
File "enum.py", line 17, in <module>
print enum.FOOBAR
File "enum.py", line 11, in __getattr__
raise AttributeError("Invalid constant: %s" % name)
AttributeError: Invalid constant: FOOBAR