在Python Flask及其他语言中避免使用魔法数字

1 投票
1 回答
1187 浏览
提问于 2025-04-17 17:25

我正在为我的应用程序定义一些模型,需要一个叫做“状态”的列,用于各种验证过程。这里是一个简化的用户模型。

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)

编辑 添加了一个构建类的方法,这样就可以用字符串来创建枚举了。

虽然可能还有更好的解决方案。

撰写回答