在Python Dict中优先处理错误消息

时间:2018-04-23 18:33:57

标签: python list dictionary error-handling

我进行API调用,如果出现问题,他们会返回错误列表:例如

[
{'field': u'currency', 'message': 'must be USD', 
 'request_pointer': '/customer_bank_accounts/currency'}, 
{'field': 'iban', 'message': 'is invalid', 
'request_pointer': u'/customer_bank_accounts/iban'}]

我想向用户返回一个错误并优先处理错误。错误可以按任何顺序排列。

我知道我可以抛出整个列表寻找第一个错误,例如

for error in errors:
    if error['message'] == 'is invalid' and error['field'] == 'iban'
        return "error message 1"

for error in errors:
    if error['message'] == 'is invalid' and error['field'] == 'country code'
        return "error message 2"

但这是丑陋的代码,涉及完全多次遍历列表。有没有更好的方法呢?

4 个答案:

答案 0 :(得分:2)

我是使用字典输入的忠实粉丝。它们易于存储,提供O(1)查找,并确保您的输入与逻辑分离。

errors = [{'field': u'currency', 'message': 'must be USD', 
           'request_pointer': '/customer_bank_accounts/currency'}, 
          {'field': 'iban', 'message': 'is invalid', 
           'request_pointer': u'/customer_bank_accounts/iban'}]

error_dict = {('is invalid', 'iban'): 'error message 1',
              ('is invalid', 'country code'): 'error message 2'}

for idx, error in enumerate(errors):
    key = (error['message'], error['field'])
    if key in error_dict:
        print(idx, error_dict[key])

答案 1 :(得分:0)

在我看来,你应该创建自己的错误

class USDException(Exception):
    "Exception Here"
    pass

然后,您可以使用属性错误处理技术来传递适当的错误,例如

try:
  dostuff()
except Exception as e:
  print(e)

答案 2 :(得分:0)

你可以做一个矩阵。

使用第一个索引作为消息构建,第二个作为字段构建。你之前建立。

构建矩阵:

code_error['is invalid']['iban'] = 'error message 1'
...

使用:

return code_error[error['message']][error['field']]

我觉得它看起来会更漂亮。它会变得更有条理。

答案 3 :(得分:0)

您可以尝试制作一组​​您关注的errors列表中的一部分:

errorset = set([d['field']+' '+d['message'] for d in errors])
if 'iban is invalid' in errorset:
     return "error message 1"
elif 'country code is invalid' in errorset:
     return "error message 2"

集合具有常量查找时间以检查某些内容是否为成员,因此您只需在制作更易于阅读的列表并将其添加到集合中时遍历列表。