否定的なステータスが 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 です。
補遺: ID の 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)
2 番目の編集: 離れられませんでした。名前を書いた順に値を割り当てるバリアントを次に示します。
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()
明らかに、複雑さが増すことはエレガントではありませんが、機能します。