| # 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__) |