Python:如何交替访问对象或字典?

4 投票
3 回答
655 浏览
提问于 2025-04-16 07:24

我正在写一个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'])

我在寻找一种更优雅、更简洁的方法来实现这个功能。

有没有办法可以通过键来获取或设置数据,这种方法既适用于字典也适用于对象?

3 个回答

2

我不太清楚这样做会有什么影响,但我会在Django模型里加一个方法,让它能够把字典里的数据读进来,这样你就可以通过模型来访问这些数据了。

6

在JavaScript中,它们是等价的(这通常很有用;我提到这个是因为你可能不知道,尤其是在做网页开发的时候),但在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,可以获取或设置这个值。

6

你可以使用一个叫做 Bunch 类 的东西,它可以把字典变成一种可以用点号(.)来访问的形式。

撰写回答