[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