[Python-ideas] Override dict.__new__ to raise if cls is not dict; do the same for str, list, etc.

Steven D'Aprano steve at pearwood.info
Thu Apr 21 22:00:17 EDT 2016


On Thu, Apr 21, 2016 at 09:43:17AM -0400, Random832 wrote:
> On Thu, Apr 21, 2016, at 07:17, Steven D'Aprano wrote:
> > and it runs counter to a documented feature of dicts, that they can be 
> > subclassed and given a __missing__ method:
> > 
> > "If a SUBCLASS OF DICT [emphasis added] defines a method __missing__() 
> > and key is not present, the d[key] operation calls that method ..."
> 
> So what method should be overridden to make a dict subclass useful as a
> class or object dictionary (i.e. for attribute lookup to work with names
> that have not been stored with dict.__setitem__)? 

I don't understand your question. Or rather, if I have understood it, 
the question has a trivial answer: you don't have to override anything.

class MyDict(dict):
    pass

d = MyDict()
d.attr = 1
print(d.attr)


will do what you appear to be asking. If that's not what you actually 
mean, then you need to explain more carefully.

I will also point out that your question is based on a point of 
confusion. You ask:

"So what method should be overridden..."

but the answer to this in general must be "What makes you think a single 
method is sufficient?" This doesn't just apply to dicts, it applies in 
general to any class.

"What method do I override to make a subclass of int implement 
arithmetic with wrap-around (e.g. 999+1 = 0, 501*2 = 2)?"


> Overriding __getitem__
> or __missing__ doesn't work. My only consolation is that defaultdict
> doesn't work either.
> 
> I can't even figure out how to get the real class dict, as I would need
> if I were overriding __getattribute__ explicitly in the metaclass (which
> also doesn't work) - cls.__dict__ returns a mappingproxy.

This doesn't make anything any clearer for me.


> Alternatively, where, other than object and class dicts, are you
> actually required to have a subclass of dict rather than a UserDict or
> other duck-typed mapping?

Anywhere you have to operate with code that does "if isinstance(x, 
dict)" checks.


> Incidentally, why is __missing__ documented under defaultdict as "in
> addition to the standard dict operations"?

Because defaultdict provides __missing__ in addition to the standard 
dict operations. Is there a problem with the current docs?



-- 
Steve


More information about the Python-ideas mailing list