TypeError:多个基数具有实例布局冲突

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函数计算的.

  • 当我开始将 __slots__` 引入到 `pypdf` 时,我得到了这个 (2认同)