2014-10-29 31 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