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