gpt4 book ai didi

python - 如何使 `dict(a_instance_of_a_subclass_of_dict)` 成为 Python 2.7 中的常规字典?

转载 作者:行者123 更新时间:2023-11-28 22:53:10 25 4
gpt4 key购买 nike

我有一个 dict 的子类,但是当我将它写入数据库时​​,我想先将它转换回普通的 dict。我想使用看起来像转换的 dict(a_instance_of_a_subclass_of_dict) 但我需要决定只将某些键导出到常规字典。

我不知道当你写dict(mapping)时调用了什么特殊的映射方法所以我做了这个实验:

class Mydict(dict):
def __getattribute__(self, what):
print 'getting attribute:', what

m = Mydict(x = 2, y = 3, z = 4)

print '--------- mark ---------'
print dict(m)

它打印:

--------- mark ---------
getting attribute: keys
{'y': 3, 'x': 2, 'z': 4}

看起来 dict(mapping) 会调用 keys 映射方法。 (实际上这里发生了一些奇怪的事情。__getattribute__ 在这里返回 Nonedict 根本不依赖返回值并且仍然获得正确的内容。让我们暂时忘记这个。)

然后我像这样重写了另一个dict子类:

class Mydict2(dict):
def keys(self):
print 'here keys'
return ['x', 'y']

m2 = Mydict2(x = 2, y = 3, z = 4)

print '--------- mark2 ---------'
print dict(m2)

输出是这样的:

--------- mark2 ---------
{'y': 3, 'x': 2, 'z': 4}

它没有调用 keys 方法。又奇怪了!

有人可以解释这种行为吗?提前致谢!

最佳答案

cpython 检查 keys 的存在来决定参数是否是一个类似字典的对象:

    if (PyObject_HasAttrString(arg, "keys"))
result = PyDict_Merge(self, arg, 1);

http://hg.python.org/cpython/file/2.7/Objects/dictobject.c#l1435

然而,在稍后阶段,如果发现参数恰好是一个字典(或其子类),它不会调用 keys,而是直接访问内部哈希表。 keys 仅在类似字典的情况下被调用,例如,这按预期工作:

class Mydict2(UserDict):
def keys(self):
print 'here keys'
return ['x', 'y']

我的建议是避免摆弄系统的东西并添加一个明确的方法,如:

class Mydict2(dict):
def export(self):
return {k:self[k] for k in ['x', 'y']}

并在您要序列化对象以写入数据库时​​调用它。

关于python - 如何使 `dict(a_instance_of_a_subclass_of_dict)` 成为 Python 2.7 中的常规字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19652057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com