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

Mark Shannon mark at hotpy.org
Tue Apr 24 17:36:31 CEST 2012


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)
This doesn't work.

>>
>> is a little weird.
>> But I think it should work (ie print 'ab') properly.
>>
>> This works without the patch.
>>
>> class S(str):
>>   __getattribute__ = str.__add__
>> s = S('a')
>> print(S.b)

Same typo,
this does work (with correct spelling :) )
> 
> Does it?
> 
> $ cat > x.py
> class S(str):
>   __getattribute__ = str.__add__
> s = S('a')
> print(S.b)

> $ python3 x.py
> Traceback (most recent call last):
>   File "x.py", line 4, in <module>
>     print(S.b)
> AttributeError: type object 'S' has no attribute 'b'
> 
>> (Prints 'ab')
>>
>> Also "slot wrapper" is a low-level implementation detail and
>> shouldn't impact the language semantics.
>>
>> dict.__getitem__ is a slot wrapper; dict.__getitem__ is not.
>> str.__getitem__ is a slot wrapper; list.__getitem__ is not.
>> If any of these change then the semantics of the language changes.
> 
> 
> 



More information about the Python-Dev mailing list