私はDjangoを使用していませんが、PyramidとTwistedの下で次のようなことをかなり行っています...
def setup_mapping( pairs ):
mapping = {'id':{},'name':{}}
for (k,v) in pairs:
mapping['id'][k]= v
mapping['name'][v]= k
return mapping
class ConstantsObject(object):
_pairs= None
mapping= None
@classmethod
def lookup_id( cls , id ):
pass
@classmethod
def lookup_name( cls , name ):
pass
class StatusConstants(ConstantsObject):
CANCELLED = -1
REQUIRES_ATTENTION = 0
WORK_IN_PROGRESS = 1
COMPLETE = 2
_pairs= (
(-1, 'Cancelled'),
(0, 'Requires attention'),
(1, 'Work in progress'),
(2, 'Complete'),
)
mapping= setup_mapping(_pairs)
したがって、本質はこれです:
- 基本の「定数」クラスと、タイプごとに別のクラスがあります。クラスは、キーワードをALLCAPSの値に定義します
- 私も平文
_pairs
をクラスに投げ込みます。なぜ?それらを使用していくつかのDBテーブルを構築する必要がある場合や、エラー/ステータスメッセージ用にそれらが必要な場合があるためです。個人的な好みとして、ALLCAPS変数名ではなく数字を使用します。
- 私は
mapping
クラス変数を初期化します。これは基本的に、dict内の変数の束をプリコンパイルすることによってクラスをmonkeypatchesします。理由は...
- クラスはその基本クラスから派生します。この基本クラスは、値を検索したり、定数で頻繁に行う必要があるその他の標準的なことを実行したりするためのclassmethod機能を提供します。
これは万能のアプローチではありませんが、私は一般的にこれが本当に好きになりました。dictを使用してペアを簡単に定義し、「マッピング」関数に他の属性を設定させることができます。たとえば、ペア値のタプルをk、v、v、k、または必要になる可能性のある奇妙な形式で提供します。
私のコードは次のようになります。
status_id = sa.Column(sa.Integer, sa.ForeignKey("_status.id") , nullable=False , default=constants.StatusConstants.CANCELLED )
status_name = constants.StatusConstants.lookup_id(status_id)
status_name = constants.StatusConstants.mapping['id'][status_id]
別の方法で定数を使用する必要があるときはいつでも、ベースのクラスメソッドを追加または変更するだけです。