[Python-Dev] [Python-checkins] cpython (3.2): don't use a slot wrapper from a different special method (closes #14658)

Ethan Furman ethan at stoneleaf.us
Tue Apr 24 18:33:38 CEST 2012


Mark Shannon wrote:
> Benjamin Peterson wrote:
>> 2012/4/24 Mark Shannon <mark at hotpy.org>:
>>> I'm not happy with this fix.
>>
>> It's not perfect, but it's an improvement.
>>
>>> Admittedly code like:
>>>
>>> class S(str):
>>>   __getattr__ = str.__add__
>>> s = S('a')
>>> print(S.b)
> 
> My typo, should be:
> print(s.b)
> (Instance not class)
> 
>>> is a little weird.
>>> But I think it should work (ie print 'ab') properly.

I can easily believe I'm missing something, but here are the results 
with the patch in place:

{'x': 42} 42
{'x': 42} 42
ab

and here's the code:

class Foo1(dict):
     def __getattr__(self, key): return self[key]
     def __setattr__(self, key, value): self[key] = value

class Foo2(dict):
     __getattr__ = dict.__getitem__
     __setattr__ = dict.__setitem__

o1 = Foo1()
o1.x = 42
print(o1, o1.x)

o2 = Foo2()
o2.x = 42
print(o2, o2.x)

class S(str):
    __getattr__ = str.__add__
s = S('a')
print(s.b)

~Ethan~


More information about the Python-Dev mailing list