Python 字典从我的自定义字典更新,不使用我覆盖的方法
我有一个 dict custom_dict
的自定义实现,它覆盖并基本上受本机 Python dict 支持。
- 我重写设置 (
__setitem__
) 对值进行一些预处理,并将其存储在某个专有对象中。 - 当 get(
__getitem__
) 时,这个专有对象会被转换为更自然的格式。
从这个 custom_dict
调用时的所有功能都按照我喜欢的方式运行。
问题是,当您调用类似 {'a': 1}.update(custom_dict({'b': 2}))
时,更新后的字典中 'b' 的值是专有内部存储对象,而不是处理后的值。
Python 的原生 dict.update() 是如何工作的?我已经重写了所有我能想到的方法,items
、iteritems
、values
、itervalues
、 get
和 __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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论