I wanted to create a class out of two: collections.OrderedDict
and collections.DefaultDict
. So that I can get an ordered dictionary and have a default value for non existing keys being accessed. Whats are some ways to do this?
My solution was to create another class around the 2 classes I stated above. This makes an error due to a method in each class having the same name I think?
from collections import defaultdict, OrderedDict
class owndic(OrderedDict, defaultdict):
pass
producing
TypeError: multiple bases have instance lay-out conflict
Cheers!
Instance lay-out conflict
is a fancy way of saying that you're trying to inherit from multiple--in this case built-in--types that cannot cooperate with each other quite well. More technically these classes have conflict in functionality of their common attributes.
In this case both OrderedDict
and defaultdict
are two dictionary-like types with their own unique __setitem__
attributes and also different ways of handling the keys and values.
At C level this error happens when the best_base
function fails to calculate the best base amongst multiple base classes. There are multiple other reasons that can cause this function fail to calculate the best base or winner among other bases but in this case the error occurs when neither of following conditions happen. winner
is not None, winner
is not a subtype of candidate
*, candidate
is not a subtype of 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;
}
However, if you want to benefit from both defaultdict()
and OrderedDict()
's functionalities, you can simply use an OrderedDict
and its built-in setdefault
attribute.
Here is an example:
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])])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With