Python:如何可以互换地访问对象或字典?

发布于 2024-10-03 18:31:43 字数 425 浏览 4 评论 0原文

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

尝试寻找一种更优雅、更干燥的方式来做到这一点。

有没有一种方法可以通过适用于字典或对象的键来获取/设置?

I'm writing a Django view that sometimes gets data from the database, and sometimes from an external API.

When it comes from the database, it is a Django model instance. Attributes must be accessed with dot notation.

Coming from the API, the data is a dictionary and is accessed through subscript notation.

In either case, some processing is done on the data.

I'd like to avoid

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'])

I'm trying to find a more elegant, DRY way to do this.

Is there a way to get/set by key that works on either dictionaries or objects?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

听,心雨的声音 2024-10-10 18:31:43

您可以使用 Bunch 类,它将字典转换为接受点表示法的内容。

You could use a Bunch class, which transforms the dictionary into something that accepts dot notation.

旧夏天 2024-10-10 18:31:43

在 JavaScript 中它们是等效的(通常很有用;我提到它是为了防止您在进行 Web 开发时不知道),但在 Python 中它们是不同的 - [items]>.属性

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

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

    def __setattr__(self, attr, value):
        self[attr] = value

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

In JavaScript they're equivalent (often useful; I mention it in case you didn't know as you're doing web development), but in Python they're different - [items] versus .attributes.

It's easy to write something which allows access through attributes, using __getattr__:

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

    def __setattr__(self, attr, value):
        self[attr] = value

Then just use it as you'd use a dict (it'll accept a dict as a parameter, as it's extending dict), but you can do things like item.image_url and it'll map it to item.image_url, getting or setting.

烟若柳尘 2024-10-10 18:31:43

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

I don't know what the implications will be, but I would add a method to the django model which reads the dictionary into itself, so you can access the data through the model.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文