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

Gho*_*ica 3 python enums exception

假设以下课程:

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 ???
Run Code Online (Sandbox Code Playgroud)

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

Zer*_*eus 6

简短的回答是ValueError:

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

答案越长,几乎所有类都不存在.考虑:

class PersistenceType(enum.Enum):
    keyring = 1
    file = 2
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

如果你是从Java开始使用Python,那么值得记住的是:

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

Guido 1有一台时间机器(或者,停止写这么多代码)


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

  • 您将得到一个“KeyError”,这正是您想要的,因为您提供了一个不存在的密钥。这比自定义异常更好,因为,a)您不必实现和维护它,b)该类的用户不必去搜索以找出它的含义。 (2认同)