Josh Rosenberg added the comment:

Serhiy, doesn't this patch "fix" the issue by making subclasses with custom 
__getitem__/__delitem__ implementations not have them invoked by the 
superclass's pop/popitem?

The old code meant that pop and popitem didn't need to be overridden even if 
you overrode __getitem__/__delitem__ in a way that differed from the default 
(e.g. __setitem__ might add some tracking data to the value that __getitem__ 
strips). Now they must be overwritten.

The expiringdict's flaw seems to be that its __contains__ call and its 
__getitem__ are not idempotent, which the original code assumed (reasonably) 
they would be.

The original code should probably be restored here. The general 
PyObject_GetItem/DelItem are needed to work with arbitrary subclasses 
correctly. The Sequence_Contains check is needed to avoid accidentally invoking 
__missing__ (though if __missing__ is not defined for the subclass, the 
Sequence_Contains check could be skipped).

The only reason OrderedDict has the problem and dict doesn't is that 
OrderedDict was trying to be subclassing friendly (perhaps to ensure it remains 
compatible with code that subclassed the old Python implementation), while dict 
makes no such efforts. dict happily bypasses custom __getitem__/__delitem__ 
calls when it uses pop/popitem.

----------
nosy: +josh.r

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue27275>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to