我不使用 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
扔进了课堂。为什么?因为我可能需要用它们构建一些数据库表,或者我可能希望它们用于错误/状态消息。我使用数字而不是 ALLCAPS 变量名称作为个人偏好。
- 我初始化了一个
mapping
类变量,它基本上通过在字典中预编译一堆变量来对类进行猴子补丁,因为......
- 该类派生自该基类,该基类提供类方法功能来搜索值或执行您经常需要对常量执行的其他标准操作。
这不是一种万能的方法,但我通常真的很喜欢这种方法。您可以轻松地使用字典来定义对,让“映射”函数设置一些其他属性,例如为您提供对值的元组,如 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]
每当您需要以其他方式使用常量时,您只需添加或更改基类的类方法。