- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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__
在这里返回 None
但 dict
根本不依赖返回值并且仍然获得正确的内容。让我们暂时忘记这个。)
然后我像这样重写了另一个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/
我有一个 dict 的子类,但是当我将它写入数据库时,我想先将它转换回普通的 dict。我想使用看起来像转换的 dict(a_instance_of_a_subclass_of_dict) 但我需
我是一名优秀的程序员,十分优秀!