【问题标题】:How to get the name of a dictionary in embedded dict in Python如何在Python中的嵌入式字典中获取字典的名称
【发布时间】:2014-10-29 10:52:00
【问题描述】:

我想列出可以在我使用 Flask 构建的 API 中返回的错误列表。由于我不知道如何在内部执行此操作,因此我想到了以下内容:

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'。有没有办法将类型引用为封装字典中已知的键?

欢迎所有提示;还有关于如何改进我的错误报告设置.. :)

【问题讨论】:

  • 为什么不直接把key传给函数,key加倍作为type值呢?
  • @MartijnPieters - 我真的很喜欢这个简单的解决方案。感谢那。你知道这是否是一种常见的构建错误的方法吗?还是没有通用的方法?
  • 我一般使用异常;然后异常类体现了各种属性,而代码只是引发了该异常。
  • @MartijnPieters - 您是否有指向 Github 上显示此类用途的开源项目的链接?
  • 不是我的头顶,对不起。

标签: python dictionary error-handling flask


【解决方案1】:

要保持结构不变,请尝试使用辅助函数,即

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") 您将引用类型,它被定义为字典中的键。

【讨论】:

  • 你应该使用in而不是has_key
【解决方案2】:

如果您真的想像这样预先生成错误消息,但又不想重复使用这些文字,您可以尝试创建一个将错误存储为字段的类对象,构建一堆对象并将它们添加到字典中:

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
...

这样,每当您创建一个新错误时,它都会自动将自己注册到类范围的映射中,您无需显式添加它或重复文字。

【讨论】:

  • 感谢您的建议,但我并没有真正看到这样做的额外优势。我真的很喜欢 Martijn Pieters 在最初问题下方的评论中提出的建议。你的回答对我有什么好处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多