Python 字典从我的自定义字典更新,不使用我覆盖的方法

发布于 2024-10-12 23:01:07 字数 864 浏览 2 评论 0原文

我有一个 dict custom_dict 的自定义实现,它覆盖并基本上受本机 Python dict 支持。

  • 我重写设置 (__setitem__) 对值进行一些预处理,并将其存储在某个专有对象中。
  • 当 get(__getitem__) 时,这个专有对象会被转换为更自然的格式。

从这个 custom_dict 调用时的所有功能都按照我喜欢的方式运行。

问题是,当您调用类似 {'a': 1}.update(custom_dict({'b': 2})) 时,更新后的字典中 'b' 的值是专有内部存储对象,而不是处理后的值。

Python 的原生 dict.update() 是如何工作的?我已经重写了所有我能想到的方法,itemsiteritemsvaluesitervaluesget__getitem__,但我似乎还没有确定 update() 尝试访问的任何一个,这让我相信它可能使用c代码。想法?

更新:我刚刚在 CPython 源代码中发现了这一点:

if (PyDict_Check(b)) {
    ...
}
else {
    /* Do it the generic, slower way */
    ...
}

也许这是一个错误,应该是 PyDict_CheckExact(b) ,如代码中其他各个位置所示。

知道如何击败这张支票吗?

I have a custom implementation of dict custom_dict, which overrides and is by-and-large supported by the native Python dict.

  • I override setting (__setitem__) to do some preprocessing to the value, and store it in some proprietary object.
  • When getting(__getitem__), this proprietary object is then converted to a more natural format.

All features when invoked from this custom_dict behave as I like.

The problem is that when you call something like {'a': 1}.update(custom_dict({'b': 2})), the value for 'b' in the updated dict is the proprietary internal storage object, and not the processed value.

How does Python's native dict.update() work? I've overridden all the methods I could think of it using, items, iteritems, values, itervalues, get, and __getitem__, but I haven't seemed to nail any of the ones update() tries to access, which leads me to believe it might be using the c code. Thoughts?

UPDATE: I just found this in the CPython source code:

if (PyDict_Check(b)) {
    ...
}
else {
    /* Do it the generic, slower way */
    ...
}

Perhaps this is a bug, and that should be PyDict_CheckExact(b) as shows up in various other places in the code.

Any idea how to beat this check?

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文