use*_*760 12 python class python-3.x defaultdict
我想用两个创建一个类:collections.OrderedDict和collections.DefaultDict.这样我就可以获得一个有序的字典,并为访问的现有密钥设置一个默认值.有什么方法可以做到这一点?
我的解决方案是围绕我上面提到的两个类创建另一个类.由于我认为每个类中的方法具有相同的名称,这会导致错误吗?
from collections import defaultdict, OrderedDict
class owndic(OrderedDict, defaultdict):
pass
Run Code Online (Sandbox Code Playgroud)
生产
TypeError: multiple bases have instance lay-out conflict
Run Code Online (Sandbox Code Playgroud)
干杯!
Kas*_*mvd 16
发生此异常是因为您尝试从多个内置类型继承,这些类型在C级别上无法相互协作.这意味着这些类在其类似属性的功能上存在冲突.在这种情况下,两个OrderedDict和defaultdict两个类似字典的类型具有自己的唯一__setitem__属性以及处理键和值的不同方式.
在C级别,当best_base函数无法计算多个基类中的最佳基数时,会发生此错误.有许多其他原因导致此功能无法计算其他基础中的最佳基数或赢家,但在这种情况下,当以下两种情况都不会发生时,会发生错误.winner不是None,winner不是candidate*的子类型,candidate不是子类型winner.
candidate = solid_base(base_i);
if (winner == NULL) {
winner = candidate;
base = base_i;
}
else if (PyType_IsSubtype(winner, candidate))
;
else if (PyType_IsSubtype(candidate, winner)) {
winner = candidate;
base = base_i;
}
else {
PyErr_SetString(
PyExc_TypeError,
"multiple bases have "
"instance lay-out conflict");
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你想从二者受益defaultdict()和OrderedDict()的功能,你可以简单地使用OrderedDict其内置的setdefault属性.
这是一个例子:
In [13]: d = OrderedDict()
In [14]: for i, j in enumerate(['k', 'r', 'k', 'j', 'j', 't']):
d.setdefault(j, []).append(i)
....:
In [15]: d
Out[15]: OrderedDict([('k', [0, 2]), ('r', [1]), ('j', [3, 4]), ('t', [5])])
Run Code Online (Sandbox Code Playgroud)
*candidate是base_i传递给类调用者的基础之一的基础,它是使用solid_base函数计算的.
| 归档时间: |
|
| 查看次数: |
3173 次 |
| 最近记录: |