假设以下课程:
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,我只是想知道:应该在这里提出哪种特殊的异常?
答案 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
的内置功能可以带来以下几个优势:
你写的代码要少得多。
你不是要重复整个地方的枚举成员的名字,所以如果你在某个时候修改它,你就不会错过任何东西。
您的枚举用户以及使用它的代码读者不需要记住或查找任何自定义方法。
如果您是从Java学习Python,那么始终值得记住:
Python Is Not Java(或者,停止编写这么多代码)
Guido1 has a time machine(或者,停止编写这么多代码)
1 ......或者在这种情况下,Ethan Furman是enum
模块的作者。