【问题标题】:Python: How can you access an object or dictionary interchangeably?Python:如何交替访问对象或字典?
【发布时间】:2011-05-13 08:37:47
【问题描述】:

我正在编写一个 Django 视图,该视图有时从数据库获取数据,有时从外部 API 获取数据。

当它来自数据库时,它是一个 Django 模型实例。必须使用点符号访问属性。

来自 API,数据是一个字典,通过下标符号访问。

在任何一种情况下,都会对数据进行一些处理。

我想避免

if from_DB:
   item.image_url='http://example.com/{0}'.format(item.image_id)
else:
   item['image_url']='http://example.com/{0}'.format(item['image_id'])

我正在尝试找到一种更优雅、更干的方法来做到这一点。

有没有一种方法可以在字典或对象上通过键获取/设置?

【问题讨论】:

    标签: python django dictionary object


    【解决方案1】:

    您可以使用Bunch class,它将字典转换为接受点符号的内容。

    【讨论】:

    • 刚刚查看了它的源代码,这是我的简单AttrDict 的稍微完善的版本(提供正确的AttributeError 而不是KeyError,提供__repr____delattr__ 并提供递归转换方法)。我怀疑我自己会不会找到它......“Bunch”似乎是一个相当不具描述性的名字。
    • 感谢您了解/找到这个课程,这真的很有帮助。
    【解决方案2】:

    在 JavaScript 中它们是等价的(通常很有用;我提到它以防你在进行 Web 开发时不知道),但在 Python 中它们是不同的 - [items].attributes

    使用__getattr__编写允许通过属性访问的东西很容易:

    class AttrDict(dict):
        def __getattr__(self, attr):
            return self[attr]
    
        def __setattr__(self, attr, value):
            self[attr] = value
    

    然后像使用 dict 一样使用它(它会接受 dict 作为参数,因为它正在扩展 dict),但您可以执行 item.image_url 之类的操作,它会将其映射到item.image_url,获取或设置。

    【讨论】:

    • 很好,很好的建议。我将接受@Daniel 的回答,因为他找到/知道了一个完整的课程,但是这应该很酷,因为你得到了 7 个赞成票,包括我的。谢谢!
    • 是的,如果你不介意额外的依赖(或者只是想把它拉到主树中),Bunch 是一个更准确的解决方案。通常这样就足够了,但那个更准确(AttributeError 而不是 KeyError,特别是提供del 支持)。谢谢:-)
    【解决方案3】:

    我不知道会有什么影响,但我会在 django 模型中添加一个方法,将字典读入自身,这样您就可以通过模型访问数据。

    【讨论】:

    • 我实际上并没有过多地使用自定义模型,所以我不得不承认我不确定这意味着什么。使用.values() 获取 ValuesQuerySet 也是另一种选择,它只需将模型对象更改为字典。
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 2021-08-12
    • 2012-06-03
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多