| # 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(*args): | 
 | 	if len(args) > 0: | 
 | 		if len(args) == 1: | 
 | 			args = args[0] | 
 | 		return listattrs(args) | 
 | 	else: | 
 | 		import __main__ | 
 | 		return listattrs(__main__) |