2014-10-29 28 views
0

我想列出一些錯誤,我可以在我使用Flask構建的API中返回這些錯誤。因爲我不知道如何在內部做到這一點,我想到了以下幾點:如何在Python中使用嵌入式字典獲取字典的名稱

ERRORS = { 
    'something_went_wrong': { 
     'code': 1, 
     'type': 'something_went_wrong', 
     'message': 'Something went horribly wrong. Check yo self.' 
    }, 
    'something_else_went_wrong': { 
     'code': 2, 
     'type': 'something_else_went_wrong', 
     'message': 'Now something else went wrong..' 
    }, 
} 

如果我當時想創建一個錯誤響應,我簡單從字典得到的錯誤,並把它傳遞給函數它返回錯誤。這到目前爲止工作正常。我唯一不喜歡的是,我列出了type double。首先作爲字典的關鍵字,後來作爲字典中的'type'。有沒有一種方法可以將該類型引用爲封裝字典中已知的關鍵字?

歡迎提供所有提示;關於如何改善我的錯誤報告設置.. :)

+4

爲什麼不把鍵傳遞給該函數,並且鍵的類型值增加了一倍? – 2014-10-29 10:53:03

+0

@MartijnPieters - 我真的很喜歡這個簡單的解決方案。感謝那。你知道這是否是常見的構造錯誤的方法?還是沒有共同的方式? – kramer65 2014-10-29 13:55:53

+0

我一般使用異常;異常類則體現了各種屬性,代碼只會引發異常。 – 2014-10-29 13:58:43

回答

2

爲了讓您的結構,因爲它是,嘗試使用一個輔助功能,即

def printError(err_type): 
    if ERRORS.has_key(err_type): 
     print "Type:", err_type 
     print "Message:", ERRORS[err_type].get("message") 
     print "Code:", ERRORS[err_type].get("code") 

因此呼籲printError("something_went_wrong")你會參考型,即定義爲在你的字典的關鍵。

+1

你應該使用'in'而不是'has_key'。 – dirn 2014-10-29 12:19:14

0

如果您確實想要預先生成像這樣的錯誤消息,但不想用這些文字重複自己,您可以嘗試創建一個類對象存儲錯誤的領域,建立了一堆的對象,並將它們添加到字典:

class MyAPIError(object): 
    error_map = {} 
    def __init__(self, code, error_type, message): 
      self.code = code 
      self.error_type = error_type 
      self.message = message 
      self.error_map[error_type] = self 


err1 = MyAPIError(1, "something_went_wrong", 'Something went horribly wrong. Check yo self.') 
err2 = MyAPIError(2, "something_else_went_wrong", 'Now something else went wrong..') 

MyAPIError.error_map 
... 

這樣,當你創建一個新的錯誤,它會自動與類全圖自己註冊,而且您不需要明確地添加它或重複文字。

+0

感謝您的建議,但我並沒有真正看到這一點的附加優勢。我非常喜歡Martijn Pieters在他最初提問下的評論中提出的建議。您的回答將如何從他的評論中受益? – kramer65 2014-10-29 13:55:03