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

时间:2018-01-07 09:53:04

标签: python python-3.x class defaultdict

我想用两个创建一个类:collections.OrderedDictcollections.DefaultDict。这样我就可以获得一个有序的字典,并为访问的现有密钥设置一个默认值。什么方法可以做到这一点?

我的解决方案是围绕我上面提到的两个类创建另一个类。由于我认为每个类中的方法具有相同的名称会导致错误吗?

from collections import defaultdict, OrderedDict
class owndic(OrderedDict, defaultdict):
    pass
制造

TypeError: multiple bases have instance lay-out conflict

干杯!

1 个答案:

答案 0 :(得分:14)

发生此异常是因为您尝试从多个内置类型继承,这些内置类型无法在C级别相互协作。这意味着这些类在其类似属性的功能上存在冲突。在这种情况下,OrderedDictdefaultdict都是两个类似字典的类型,具有自己独特的__setitem__属性以及处理键和值的不同方式。

在C级别,当best_base函数无法计算多个基类中的最佳基数时,会发生此错误。有许多其他原因导致此功能无法计算其他基础中的最佳基数或赢家,但在这种情况下,当以下两种情况都不会发生时,会发生错误。 winner不是无,winner不是candidate * 的子类型,candidate不是winner的子类型。< / p>

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;

}

但是,如果您希望同时受益于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])])

<子> * candidatebase_i的坚实基础,是传递给类调用者的基础之一,使用solid_base函数计算。