mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 07:01:21 +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__)
 |