mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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__)
 | 
