最优雅的方式存储和使用自定义状态码

1 投票
2 回答
1742 浏览
提问于 2025-04-27 12:06

这个问题确实有点傻(可能也带有一些个人观点),但我想知道怎么创建一个像枚举那样的对象,用来存储一些常量,比如错误代码,以便在代码中后续使用。

我想到有四种选择:

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上有可以兼容的版本可以下载。

撰写回答