Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError:多个基具有实例布局冲突_Python_Python 3.x_Class_Defaultdict - Fatal编程技术网

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

Python TypeError:多个基具有实例布局冲突,python,python-3.x,class,defaultdict,Python,Python 3.x,Class,Defaultdict,我想从两个类中创建一个类:collections.OrderedDict和collections.DefaultDict。这样我就可以得到一个有序的字典,并为访问的不存在的键设置一个默认值。有什么方法可以做到这一点 我的解决方案是围绕我上面提到的两个类创建另一个类。我想这是因为每个类中的方法都有相同的名称而导致的错误 from collections import defaultdict, OrderedDict class owndic(OrderedDict, defaultdict):

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

我的解决方案是围绕我上面提到的两个类创建另一个类。我想这是因为每个类中的方法都有相同的名称而导致的错误

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

TypeError: multiple bases have instance lay-out conflict

干杯

实例布局冲突
是一种奇特的说法,表示您试图从多个(在本例中是内置的)类型继承,这些类型之间无法很好地协作。更严格地说,这些类在其公共属性的功能上存在冲突

在这种情况下,
OrderedDict
defaultdict
都是两种类似字典的类型,它们有自己独特的
\uuuuuuu setitem\uuuuuu
属性以及处理键和值的不同方式

在C级,当函数无法计算多个基类中的最佳基类时,就会发生此错误。有多种其他原因可导致此函数无法计算其他基数中的最佳基数或优胜者,但在这种情况下,当以下两种情况均未发生时,会发生错误<代码>获胜者不是无,
获胜者
不是
候选人
*的子类型,
候选人
不是
获胜者
的子类型

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()
orderedict()
的功能,只需使用
orderedict
及其内置的
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'的实数基,它是传递给类调用者的一个基,使用['solid_base`]计算(https://github.com/python/cpython/blob/ce5b0e9db1b9698e6ffc43ae41cf3a22ca5a6ba6/Objects/typeobject.c#L2086)功能。
您使用的是什么版本的Python?我无法在Python 3.4.2上重现错误,除非您的
TypeError
的原因是什么,如果您想同时使用这两种功能,最好使用
orderedict
,它是
setdefault()
属性,该属性具有与
defaultdict
相同的功能。错误似乎是因为
defaultdict
orderedict
都继承自内置的
dict
类型(它们唯一的基类型),python中不允许这样做。hackerrank中的Python3没有说明确切的版本。可爱的我会尝试设置默认值谢谢!