为未知的枚举值提出什么样的异常?

时间:2017-04-06 10:35:36

标签: python exception enums

假设以下课程:

class PersistenceType(enum.Enum):
  keyring = 1
  file = 2

  def __str__(self):
    type2String = {PersistenceType.keyring: "keyring", PersistenceType.file: "file"}
    return type2String[self]

  @staticmethod
  def from_string(type):
    if (type == "keyring" ):
        return PersistenceType.keyring
    if (type == "file"):
        return PersistenceType.file
    raise ???

作为一个python noob,我只是想知道:应该在这里提出哪种特殊的异常?

1 个答案:

答案 0 :(得分:6)

简短回答是ValueError

  

当内置操作或函数接收到具有正确类型但值不合适的参数时引发,并且情况不会由更精确的异常描述,例如IndexError

答案越长,该类几乎不存在。考虑:

class PersistenceType(enum.Enum):
    keyring = 1
    file = 2

这为您提供了自定义枚举所做的一切:

  • 要获得与自定义__str__方法相同的结果,只需使用name属性:

    >>> PersistenceType.keyring.name
    'keyring'
    
  • 要使用其名称获取枚举的成员,请将枚举视为词典:

    >>> PersistenceType['keyring']
    <PersistenceType.keyring: 1>
    

使用Enum.enum的内置功能可以带来以下几个优势:

  1. 你写的代码要少得多。

  2. 你不是要重复整个地方的枚举成员的名字,所以如果你在某个时候修改它,你就不会错过任何东西。

  3. 您的枚举用户以及使用它的代码读者不需要记住或查找任何自定义方法。

  4. 如果您是从Java学习Python,那么始终值得记住:

    Python Is Not Java(或者,停止编写这么多代码)

    Guido1 has a time machine(或者,停止编写这么多代码)

    1 ......或者在这种情况下,Ethan Furman是enum模块的作者。