1

アプリのモデルを定義していますが、さまざまな検証手順のために「ステータス」という名前の列が必要です。これは単純化されたユーザー モデルです。

クラス ユーザー
    id(整数)
    名前(文字列)
    status(int) # 0- 新規 1-アクティブ 2-非アクティブ 3-報告済み 4-削除済み

私は仲間の Python 開発者に私のコードをレビューするように依頼しました。彼は私が「マジックナンバー」を避けるように提案しました。彼の解決策は次のとおりです。

クラスの選択肢:
    @クラスメソッド
    def get_value (cls、キー):
        # 表示する必要がある場合は、文字列表示を取得します
        for k, v in cls.CHOICES:
            k == キーの場合:
                v を返す
        戻る ""

クラス UserStatusChoices(Choices):
    新規 = 0
    アクティブ = 1
    非アクティブ = 2
    報告済み = 3
    削除済み = 4

    選択肢 = (
        (NEW, "NEW"),
        (アクティブ、「アクティブ」)、
        (非アクティブ、「非アクティブ」)、
        (報告、「報告」)、
        (削除済み、「削除済み」)、
    )

代わりに簡単な辞書を使用できませんか? 「クラス」のソリューションの正当な理由がわかる人はいますか?

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 に答える