
On Mon, Mar 04, 2019 at 03:43:48PM +0200, Serhiy Storchaka wrote:
01.03.19 12:44, Steven D'Aprano пише:
On Fri, Mar 01, 2019 at 08:47:36AM +0200, Serhiy Storchaka wrote:
Currently Counter += dict works and Counter + dict is an error. With this change Counter + dict will return a value, but it will be different from the result of the += operator.
That's how list.__iadd__ works too: ListSubclass + list will return a value, but it might not be the same as += since that operates in place and uses a different dunder method.
Why is it a problem for dicts but not a problem for lists?
Because the plus operator for lists predated any list subclasses.
That doesn't answer my question. Just because it is older is no explaination for why this behaviour is not a problem for lists, or a problem for dicts. [...]
What's wrong with doing this?
new = type(self)()
Or the equivalent from C code. If that doesn't work, surely that's the fault of the subclass, the subclass is broken, and it will raise an exception.
Try to do this with defaultdict.
I did. It seems to work fine with my testing: py> defaultdict() defaultdict(None, {}) is precisely the behaviour I would expect. If it isn't the right thing to do, then defaultdict can override __add__ and __radd__.
Note that none of builtin sequences or sets do this. For good reasons they always return an instance of the base type.
What are those good reasons? -- Steven