[Python-Dev] [Python-checkins] cpython (3.2): don't use a slot wrapper from a different special method (closes #14658)
Benjamin Peterson
benjamin at python.org
Tue Apr 24 17:30:40 CEST 2012
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)
>
> 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)
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.
--
Regards,
Benjamin
More information about the Python-Dev
mailing list