mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.8 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__)
 | 
