1

我正在为我的应用程序定义模型,并且我需要一个名为“状态”的列来进行各种验证程序。这是一个简化的用户模型。

类用户
    编号(整数)
    名称(字符串)
    status(int) # 0-新建 1-活动 2-不活动 3-报告 4-删除

我请一位 Python 开发人员检查我的代码;他建议我避免使用“幻数”。他的解决方案是这样的:

班级选择:
    @classmethod
    def get_value(cls, key):
        # 如果需要显示则获取字符串显示
        对于 cls.CHOICES 中的 k、v:
            如果 k == 键:
                返回 v
        返回 ””

类用户状态选择(选择):
    新 = 0
    活跃 = 1
    非活动 = 2
    报告 = 3
    已删除 = 4

    选择 = (
        (新,“新”),
        (活动,“活动”),
        (不活跃,“不活跃”),
        (报告,“报告”),
        (已删除,“已删除”),
    )

我不能用简单的字典来代替吗?有没有人看到'class'y解决方案的充分理由?

4

1 回答 1

3

基于Python Enum 类构建(使用 tostring fromstring)

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)

编辑添加了构建类方法,以便可以使用字符串来构建枚举。

尽管那里可能有更好的解决方案。

于 2013-02-28T10:04:42.790 回答