Hooking dir()
September 07, 2006

While working with proxy objects I found introspection quite hard, as the mechanism of dir() just looks at the object's __dict__ (with some exceptions), and there's no way to customize this introspection. But do not fear, hacking skillz are near! After reading into the machinery of dir(), I found a nifty solution to this problem.

Note: since python 2.6, __dir__ is a special method that's invoked by dir(), if it exists, so there's no reason to use this code. Use only on earlier versions of python.

Code

__members__ = property(lambda self: self.__dir__())

Example

>>> class CustomDir(object):
...     __members__ = property(lambda self: self.__dir__())
...
...     def __dir__(self):
...         return "a list of fake attributes".split()
...
>>> c = CustomDir()
>>> dir(c)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__getattribute__', 
'__hash__', '__init__', '__members__', '__module__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'a', 
'attributes', 'fake', 'list', 'of']