如何在python中实现“退出代码”?

2024-10-01 15:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

一开始我想做些类似的事情:

#EXIT CODES
class ExitCode(object):
    (USERHOME_INVALID, \
    USERHOME_CANNOT_WRITE, \
    USERHOME_CANNOT_READ, \
    BASHRC_INVALID) = range(-1, -5, -1)

但是我意识到我必须确切地知道退出代码的总数,这样我就可以把它传递给range()函数。假设我有87个(任意)出口代码。。。我不想数到87(不是很难),但我正在寻找一个更优雅的解决方案。在

有什么建议吗?在

编辑: EXIT_CODE是一个将传递给系统出口. 与其写数字,我更喜欢使用某种常量(比如C中的定义或枚举,或者Java中的枚举)。在


Tags: 代码readobjectexitrange事情codesclass
3条回答

听起来你想要的是Python等价的C语言或其他类似语言中的枚举。How can I represent an 'Enum' in Python?提供了几种解决方案,尽管它们仍然需要您拥有的项数。 编辑:How can I represent an 'Enum' in Python?看起来更好。在

或者你可以试试这样的方法(也许不是最好的解决方案):

class _ExitCode:
    _exit_codes=["EXIT_CODE","EXIT_CODE_TWO"]
    def __getattr__(self, name):
        if name in _ExitCode._exit_codes:
            return -(_ExitCode._exit_codes.index(name)+1)
        raise AttributeError("Exit code %s not found" % name)

ExitCode=_ExitCode()
print ExitCode.EXIT_CODE #-1

我必须指出,一点也不确定消极的地位对系统出口();至少在Linux上,它将被解释为无符号的8位值(范围0-255)。对于枚举类型,可以执行以下操作:

class ExitStatus: pass
for code, name in enumerate("Success Failure CriticalFailure".split()):
    setattr(ExitStatus, name, code)

结果是:

^{pr2}$

在普通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()

显然,日益增长的复杂性是不雅观的,但它确实奏效了。在

也许我不明白这个问题,但为什么不简单地编写一个退出代码字典,并在函数中实现所需的行为呢?在

EXIT_CODES = dict(SUCCESS=0,
                  USER_NAME_INVALID=-1,
                  OTHER_ERROR=-2)

def exit(code):
   try:
      return EXIT_CODES[code]  
   except KeyError:
      raise KeyError("exit code %s is not implemented" % code)

所以你可以像

^{pr2}$

如果你想“自动”分配数字(我不建议这样),你只需创建一个退出代码列表并返回索引的负数:

EXIT_CODES = ['SUCCESS', 'ERROR_1', 'ERROR_2']
return -EXIT_CODES.index('ERROR_1')
# will return -1

(对于最后一个,您可以实现类似于基于字典的函数)

相关问题 更多 >

    热门问题