在Python Flask及其他语言中避免使用魔法数字
我正在为我的应用程序定义一些模型,需要一个叫做“状态”的列,用于各种验证过程。这里是一个简化的用户模型。
class User id(int) name(str) status(int) # 0- New 1-Active 2-Inactive 3-Reported 4-Deleted
我请一个Python开发者帮我检查代码,他建议我避免使用“魔法数字”。他的解决方案是这样的:
class Choices: @classmethod def get_value(cls, key): # get the string display if need to show for k, v in cls.CHOICES: if k == key: return v return "" class UserStatusChoices(Choices): NEW = 0 ACTIVE = 1 INACTIVE = 2 REPORTED = 3 DELETED = 4 CHOICES = ( (NEW, "NEW"), (ACTIVE, "ACTIVE"), (INACTIVE, "INACTIVE"), (REPORTED, "REPORTED"), (DELETED, "DELETED"), )
我能不能用简单的字典来代替呢?有没有人觉得使用“类”的方法更好?
1 个回答
3
基于 Python的枚举类(带有字符串转换功能) 的内容
class Enum(object):
@classmethod
def tostring(cls, val):
for k,v in vars(cls).iteritems():
if v==val:
return k
@classmethod
def fromstring(cls, str):
return getattr(cls, str.upper(), None)
@classmethod
def build(cls, str):
for val, name in enumerate(str.split()):
setattr(cls, name, val)
class MyEnum(Enum):
VAL1, VAL2, VAL3 = range(3)
class YourEnum(Enum):
CAR, BOAT, TRUCK = range(3)
class MoreEnum(Enum):
pass
print MyEnum.fromstring('Val1')
print MyEnum.tostring(2)
print MyEnum.VAL1
print YourEnum.BOAT
print YourEnum.fromstring('TRUCK')
# Dodgy semantics for creating enums.
# Should really be
# MoreEnum = Enum.build("CIRCLE SQUARE")
MoreEnum.build("CIRCLE SQUARE")
print MoreEnum.CIRCLE
print MoreEnum.tostring(1)
print MoreEnum.tostring(MoreEnum.CIRCLE)
编辑 添加了一个构建类的方法,这样就可以用字符串来创建枚举了。
虽然可能还有更好的解决方案。