Issue 7604: delattr slots inconsistancy (original) (raw)
Everything I've read about slots, seen w/ them, etc, they're effectively just a change in the underlying allocation- yes they can limit the attributes, but that's about it.
Specifically, for general attribute access/mangling, best I can tell, they're supposed to be exactly equivalent when manipulating the object- the only difference being the backing store.
That said, delattr against slotted objects vs non slotted differs in a rather buggy way- even worse, the behaviour differs on slotted classes dependant on if you're delattr'ing a slotted attr or a nonslotted- consider the following code.
class nonslotted(object): pass
class slotted(object): slots = ("monkeys",)
try: ns = nonslotted() assert not hasattr(ns, 'monkeys') del ns.monkeys raise AssertionError("this is unreachable") except AttributeError: pass try: s = slotted() assert not hasattr(s, 'monkeys') del s.monkeys print "slotting causes delattr to not throw an AttributeError"
and now for the kicker
del s.some_attr_that_is_not_slotted except AttributeError: print "so... delattr results in AttributeError on a non-slotted attr, but throws no AttributeError on a slotted attr..."
I'm guessing this isn't intentional/desired?
Confirmed on py2.6/py3.1 also; that said, I'd assume it affects all versions of python that support slots...
2009/12/30 Brian Harring <report@bugs.python.org>:
Brian Harring <ferringb@gmail.com> added the comment:
Any chance of this landing in py2.7? It's really a nasty wrench in the works for some a mapping object essentially maps onto slots for memory efficiency...
It will be in 2.6.5, 2.7, 3.1.2, and 3.2.