[issue12248] __dir__ semantics changed in Python 2.7.2

Benjamin Peterson report at bugs.python.org
Sun Jun 5 00:18:56 CEST 2011


Benjamin Peterson <benjamin at python.org> added the comment:

2011/6/4 Soren Hansen <report at bugs.python.org>:
>
> Soren Hansen <soren at linux2go.dk> added the comment:
>
> 2011/6/4 Benjamin Peterson <report at bugs.python.org>:
>> 2011/6/4 Soren Hansen <report at bugs.python.org>:
>>> So my question is: If this change stays (which seems clear given that the only changes proposed here are ways of relaxing the type requirement of the __dir__ method's return value, not reverting the change altogether), and I have an old-style class with a __getattr__ defined, how do I make that class return whatever it would have usually returned for __dir__()?
>>
>> Yes, this is a limitation of magic methods on old style classes. The
>> usual method is something like this:
>>
>>    def __getattr__(self, name):
>>        if name == "__dir__":
>>            return self.__dir__
>>        # Other stuff
>>
>> Of course, the best fix is to use new-style classes. :)
>
> If I do this:
>
> ===== test.py ======
> class Foo:
>    def __getattr__(self, name):
>        if name == '__dir__':
>            return self.__dir__
>        return 'something else'
>
> a = Foo()
> print dir(a)
> ====================
>
> After a lot of this:
>  File "test.py", line 4, in __getattr__
>    return self.__dir__
>  File "test.py", line 4, in __getattr__
>    return self.__dir__
>  File "test.py", line 4, in __getattr__
>    return self.__dir__
>
> ...I end up with a "RuntimeError: maximum recursion depth exceeded". I
> can't say I'm surprised :)

Ah, sorry I should have thought before writing that. :)
self.__class__.__dir__.__get__(self, self.__class__) should work,
though.

----------

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue12248>
_______________________________________


More information about the Python-bugs-list mailing list