| # New dir() function | 
 |  | 
 |  | 
 | # This should be the new dir(), except that it should still list | 
 | # the current local name space by default | 
 |  | 
 | def listattrs(x): | 
 |     try: | 
 |         dictkeys = x.__dict__.keys() | 
 |     except (AttributeError, TypeError): | 
 |         dictkeys = [] | 
 |     # | 
 |     try: | 
 |         methods = x.__methods__ | 
 |     except (AttributeError, TypeError): | 
 |         methods = [] | 
 |     # | 
 |     try: | 
 |         members = x.__members__ | 
 |     except (AttributeError, TypeError): | 
 |         members = [] | 
 |     # | 
 |     try: | 
 |         the_class = x.__class__ | 
 |     except (AttributeError, TypeError): | 
 |         the_class = None | 
 |     # | 
 |     try: | 
 |         bases = x.__bases__ | 
 |     except (AttributeError, TypeError): | 
 |         bases = () | 
 |     # | 
 |     total = dictkeys + methods + members | 
 |     if the_class: | 
 |         # It's a class instace; add the class's attributes | 
 |         # that are functions (methods)... | 
 |         class_attrs = listattrs(the_class) | 
 |         class_methods = [] | 
 |         for name in class_attrs: | 
 |             if is_function(getattr(the_class, name)): | 
 |                 class_methods.append(name) | 
 |         total = total + class_methods | 
 |     elif bases: | 
 |         # It's a derived class; add the base class attributes | 
 |         for base in bases: | 
 |             base_attrs = listattrs(base) | 
 |             total = total + base_attrs | 
 |     total.sort() | 
 |     return total | 
 |     i = 0 | 
 |     while i+1 < len(total): | 
 |         if total[i] == total[i+1]: | 
 |             del total[i+1] | 
 |         else: | 
 |             i = i+1 | 
 |     return total | 
 |  | 
 |  | 
 | # Helper to recognize functions | 
 |  | 
 | def is_function(x): | 
 |     return type(x) == type(is_function) | 
 |  | 
 |  | 
 | # Approximation of builtin dir(); but note that this lists the user's | 
 | # variables by default, not the current local name space. | 
 |  | 
 | def dir(x = None): | 
 |     if x is not None: | 
 |         return listattrs(x) | 
 |     else: | 
 |         import __main__ | 
 |         return listattrs(__main__) |