blob: 937c49e67b130c94226c9c6e9861f30695c6721e [file] [log] [blame]
Guido van Rossum7084ec81992-04-02 10:37:02 +00001# New dir() function
Guido van Rossumeee94981991-11-12 15:38:08 +00002
Guido van Rossumeee94981991-11-12 15:38:08 +00003
4# This should be the new dir(), except that it should still list
5# the current local name space by default
Guido van Rossum7084ec81992-04-02 10:37:02 +00006
Guido van Rossumeee94981991-11-12 15:38:08 +00007def listattrs(x):
8 try:
9 dictkeys = x.__dict__.keys()
Guido van Rossum946749f1991-12-26 13:04:02 +000010 except (AttributeError, TypeError):
Guido van Rossumeee94981991-11-12 15:38:08 +000011 dictkeys = []
12 #
13 try:
14 methods = x.__methods__
Guido van Rossum946749f1991-12-26 13:04:02 +000015 except (AttributeError, TypeError):
Guido van Rossumeee94981991-11-12 15:38:08 +000016 methods = []
17 #
18 try:
19 members = x.__members__
Guido van Rossum946749f1991-12-26 13:04:02 +000020 except (AttributeError, TypeError):
Guido van Rossumeee94981991-11-12 15:38:08 +000021 members = []
22 #
23 try:
24 the_class = x.__class__
Guido van Rossum946749f1991-12-26 13:04:02 +000025 except (AttributeError, TypeError):
Guido van Rossumeee94981991-11-12 15:38:08 +000026 the_class = None
27 #
28 try:
29 bases = x.__bases__
Guido van Rossum946749f1991-12-26 13:04:02 +000030 except (AttributeError, TypeError):
Guido van Rossumeee94981991-11-12 15:38:08 +000031 bases = ()
32 #
33 total = dictkeys + methods + members
34 if the_class:
35 # It's a class instace; add the class's attributes
36 # that are functions (methods)...
37 class_attrs = listattrs(the_class)
38 class_methods = []
39 for name in class_attrs:
40 if is_function(getattr(the_class, name)):
41 class_methods.append(name)
42 total = total + class_methods
43 elif bases:
44 # It's a derived class; add the base class attributes
45 for base in bases:
46 base_attrs = listattrs(base)
47 total = total + base_attrs
48 total.sort()
49 return total
50 i = 0
51 while i+1 < len(total):
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000052 if total[i] == total[i+1]:
Guido van Rossumeee94981991-11-12 15:38:08 +000053 del total[i+1]
54 else:
55 i = i+1
56 return total
57
Guido van Rossum7084ec81992-04-02 10:37:02 +000058
Guido van Rossumeee94981991-11-12 15:38:08 +000059# Helper to recognize functions
Guido van Rossum7084ec81992-04-02 10:37:02 +000060
Guido van Rossumeee94981991-11-12 15:38:08 +000061def is_function(x):
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000062 return type(x) == type(is_function)
Guido van Rossumeee94981991-11-12 15:38:08 +000063
Guido van Rossum7084ec81992-04-02 10:37:02 +000064
65# Approximation of builtin dir(); but note that this lists the user's
Guido van Rossumeee94981991-11-12 15:38:08 +000066# variables by default, not the current local name space.
Guido van Rossum7084ec81992-04-02 10:37:02 +000067
Guido van Rossumb6775db1994-08-01 11:34:53 +000068def dir(x = None):
69 if x is not None:
70 return listattrs(x)
Guido van Rossum7084ec81992-04-02 10:37:02 +000071 else:
72 import __main__
73 return listattrs(__main__)