2017-04-06 66 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