mirror of
https://github.com/python/cpython.git
synced 2024-12-24 09:15:04 +08:00
74 lines
1.5 KiB
Python
74 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__)
|