大多数pythonic方式来存储和使用自己的状态代码

时间:2014-10-14 12:31:31

标签: python

这肯定是一个非常愚蠢的问题(也许有点基于意见),但是我如何创建一个类似枚举的对象来存储错误代码之类的东西,这些代码是常量并且稍后可以在代码中访问?

我觉得有四种选择:

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)named tuple看起来更好,但在初始化时我看起来更糟糕了:

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 个答案:

答案 0 :(得分:12)

python中的枚举就是为此而设计的。

from enum import Enum

class STATUS(Enum):
    NEW = 0
    PENDING = 1
    DONE = 2
    ERROR = -1

枚举从3.4开始提供。如果你不是那么幸运,pypi可以提供后退。

答案 1 :(得分:1)

对于python< 3.4我个人更喜欢第四个,但是......

if some_object.status == Status.NEW:
    pass

不要那样做。您可能希望返回外部工具的错误代码,但在所有Python环境中,您应该使用异常。不同的错误代码只是引发了不同的异常。