TypeError: multiple bases have instance lay-out conflict

TypeError: multiple bases have instance lay-out conflict

我想从两个 collections.OrderedDictcollections.DefaultDict 中创建一个 class。这样我就可以得到一个有序的字典,并为正在访问的不存在的键设置一个默认值。有什么方法可以做到这一点?

我的解决方案是围绕我上面提到的 2 个 class 创建另一个 class。由于每个 class 中的方法具有相同的名称,我认为这会出错?

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

生产

TypeError: multiple bases have instance lay-out conflict

干杯!

Instance lay-out conflict 是一种奇特的说法,表示您正在尝试继承多个(在本例中为内置)类型,这些类型不能很好地相互协作。从技术上讲,这些 classes 在其共同属性的功能上存在冲突。

在这种情况下,OrderedDictdefaultdict 都是两个类似字典的类型,它们具有自己独特的 __setitem__ 属性以及处理键和值的不同方式。

在 C 级别,当 best_base 函数无法计算多个碱基 classes 中的最佳碱基时,会发生此错误。有多种其他原因可能导致此函数无法计算最佳基地或其他基地中的获胜者,但在这种情况下,当以下情况均未发生时会发生错误。 winner 不是 None,winner 不是 candidate* 的子类型,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;

}

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

* `candidate` 是 `base_i` 的坚实基础,传递给 class 调用者的基础之一,使用 [`solid_base`](https://github.com/python/cpython/blob/ce5b0e9db1b9698e6ffc43ae41cf3a22ca5a6ba6/Objects/typeobject.c#L2086) 函数。