# New dir() function and other attribute-related goodies # This should become a built-in function # def getattr(x, name): return eval('x.'+name) # 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(); this lists the user's # variables by default, not the current local name space. # Use a class method to make a function that can be called # with or without arguments. # class _dirclass: def dir(args): if type(args) = type(()): return listattrs(args[1]) else: import __main__ return listattrs(__main__) dir = _dirclass().dir