Benjamin Peterson <benja...@python.org> added the comment: 2011/6/4 Soren Hansen <rep...@bugs.python.org>: > > Soren Hansen <so...@linux2go.dk> added the comment: > > 2011/6/4 Benjamin Peterson <rep...@bugs.python.org>: >> 2011/6/4 Soren Hansen <rep...@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 <rep...@bugs.python.org> <http://bugs.python.org/issue12248> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com