我必须指出,对于 sys.exit(); 来说,负面状态完全不能确定。至少在 Linux 上,它将被解释为一个无符号的 8 位值(范围 0-255)。至于枚举类型,可以执行以下操作:
class ExitStatus: pass
for code, name in enumerate("Success Failure CriticalFailure".split()):
setattr(ExitStatus, name, code)
导致类似:
>>> ExitStatus.__dict__
{'CriticalFailure': 2, 'Failure': 1, '__module__': '__main__',
'__doc__': None, 'Success': 0}
普通 Unix 系统中的预定义值为 EXIT_FAILURE=1 和 EXIT_SUCCESS=0。
附录:考虑到 IDE 识别标识符的问题,还可以执行以下操作:
class EnumItem: pass
def adjustEnum(enum):
value=0
enumdict=enum.__dict__
for k,v in enumdict.items():
if isinstance(v,int):
if v>=value:
value=v+1
for k,v in enumdict.items():
if v is EnumItem:
enumdict[k]=value
value+=1
class ExitStatus:
Success=0
Failure=EnumItem
CriticalFailure=EnumItem
adjustEnum(ExitStatus)
第二次编辑:无法避开。这是一个按您编写名称的顺序分配值的变体。
class EnumItem:
serial=0
def __init__(self):
self.serial=self.__class__.serial
self.__class__.serial+=1
def adjustEnum(enum):
enumdict=enum.__dict__
value=0
unknowns={}
for k,v in enumdict.items():
if isinstance(v,int):
if v>=value:
value=v+1
elif isinstance(v,EnumItem):
unknowns[v.serial]=k
for i,k in sorted(unknowns.items()):
enumdict[k]=value
value+=1
return enum
@adjustEnum
class ExitStatus:
Success=0
Failure=EnumItem()
CriticalFailure=EnumItem()
显然,不断增长的复杂性并不优雅,但它确实有效。