2017-04-06 62 views
1

假设下面的类:对于未知的枚举值引发什么样的异常?

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小白,我只是想知道:什么异常的特定种类应该在这里提出?

+0

'AttributeError'?我猜这是因为当你访问一个不存在的成员时出现同样的错误。 – shahkalpesh

回答

3

简短的回答是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. 您枚举的用户,以及使用它的读码器,无需记住或查找任何定制的方法。

如果你从Java来Python的,它总是值得铭记:

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

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


......或在这种情况下伊森弗曼,该的作者模块。

+0

花式。沿着我所希望的路线。有趣的是,我将自己的代码建立在一些“更有经验”的Python人很久以前向我展示的东西上。但有一个问题:当我使用“字典”的方法......和字符串是无效的...我想我会打一个漂亮的丑陋异常消息? – GhostCat

+1

你会得到一个'KeyError',这是你想要什么,因为你已经提供了一个不存在的键。这是一个比一个自定义异常好,因为再等),你不会有实现和维护它,和b)类的用户将不必去寻找,找出这意味着什么。那么, –

+0

。是的,我需要维护的代码更少。但是现在我的外部命令行shell应该可以捕获该错误,因为用户不知道哈希值或任何内容。但我只是发现那些慷慨和“选择”给了我我需要的东西! – GhostCat