我不使用Django的,但我做類似金字塔和扭曲在以下頗有幾分......
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
折騰到類中。爲什麼?因爲我可能需要用它們構建一些數據庫表,或者我可能希望它們出現錯誤/狀態消息。我使用數字而不是ALLCAPS變量名稱作爲個人偏好。
- 我初始化
mapping
類變量由一個字典,因爲內預編譯一堆的變數,基本上monkeypatches類...
- 類是從基類,它提供了類方法的功能來搜索值或做衍生你常常需要處理常量的其他標準事情。
這不是一個通用的方法,但我通常會非常喜歡這個。你可以很容易地使用一個字典來定義對,讓'映射'功能設置一些其他的屬性,比如給你對值的元組作爲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]
,當您需要使用常量以另一種方式,你只需要添加或改變基本的classmethods。
你讀過使用'__metaclass__'這個有趣的方法嗎? http://tomforb.es/using-python-metaclasses-to-make-awesome-django-model-field-choices –