最优雅的方式存储和使用自定义状态码
这个问题确实有点傻(可能也带有一些个人观点),但我想知道怎么创建一个像枚举那样的对象,用来存储一些常量,比如错误代码,以便在代码中后续使用。
我想到有四种选择:
1) 一个状态码 - 一个变量
STATUS_NEW = 0
STATUS_PENDING = 1
STATUS_DONE = 2
STATUS_ERROR = -1
if some_object.status == STATUS_NEW:
print 'this object is pretty fresh!'
我觉得这样不太好。
2) 一个字典,里面包含所有状态码,名字作为键:
STATUS = {'new': 0, 'pending': 1, 'done': 2, 'error': -1}
if some_object.status == STATUS['new']:
print 'you got the idea.'
虽然看起来更复杂,但一个对象总比多个对象好。
3) 使用一个命名元组,看起来更好,但在初始化时看起来要复杂得多:
STATUS = namedtuple('Status', ['error', 'new', 'pending', 'done'])
STATUS = STATUS(error=-1, new=0, pending=1, done=2)
if some_object.status == STATUS.new:
print 'looks prettier than using dict!'
4) 使用一个类:
class Status:
NEW = 0
PENDING = 1
DONE = 2
ERROR = -1
if some_object.status == Status.NEW:
pass
我是不是漏掉了什么?哪种方式更推荐呢?
提前谢谢你!
2 个回答
1
对于 Python 版本低于 3.4 的情况,我个人更喜欢第四种方法,但...
if some_object.status == Status.NEW:
pass
不要这样做。你可能想要返回错误代码给外部工具,但在完全使用 Python 的环境中,你应该使用异常处理。不同的错误代码其实就是抛出的不同异常。
13
Python中的枚举(Enums)就是为了这个目的而设计的。
from enum import Enum
class STATUS(Enum):
NEW = 0
PENDING = 1
DONE = 2
ERROR = -1
枚举从Python 3.4版本开始就可以使用。如果你的Python版本比较旧,也没关系,pypi上有可以兼容的版本可以下载。