Python:如何交替访问对象或字典?
我正在写一个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 类 的东西,它可以把字典变成一种可以用点号(.)来访问的形式。