annotate Lib/newdir.py @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents 1940892d2fe3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
783
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
1 # New dir() function
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # This should be the new dir(), except that it should still list
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # the current local name space by default
783
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
6
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 def listattrs(x):
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 try:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 dictkeys = x.__dict__.keys()
525
742dc838038b Use AttributeError
Guido van Rossum <guido@python.org>
parents: 430
diff changeset
10 except (AttributeError, TypeError):
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 dictkeys = []
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 try:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 methods = x.__methods__
525
742dc838038b Use AttributeError
Guido van Rossum <guido@python.org>
parents: 430
diff changeset
15 except (AttributeError, TypeError):
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 methods = []
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 #
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 try:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 members = x.__members__
525
742dc838038b Use AttributeError
Guido van Rossum <guido@python.org>
parents: 430
diff changeset
20 except (AttributeError, TypeError):
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 members = []
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 #
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 try:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 the_class = x.__class__
525
742dc838038b Use AttributeError
Guido van Rossum <guido@python.org>
parents: 430
diff changeset
25 except (AttributeError, TypeError):
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 the_class = None
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 #
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 try:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 bases = x.__bases__
525
742dc838038b Use AttributeError
Guido van Rossum <guido@python.org>
parents: 430
diff changeset
30 except (AttributeError, TypeError):
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 bases = ()
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 #
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 total = dictkeys + methods + members
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 if the_class:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 # It's a class instace; add the class's attributes
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 # that are functions (methods)...
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 class_attrs = listattrs(the_class)
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 class_methods = []
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 for name in class_attrs:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 if is_function(getattr(the_class, name)):
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 class_methods.append(name)
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 total = total + class_methods
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 elif bases:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 # It's a derived class; add the base class attributes
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 for base in bases:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 base_attrs = listattrs(base)
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 total = total + base_attrs
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 total.sort()
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 return total
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 i = 0
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 while i+1 < len(total):
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 525
diff changeset
52 if total[i] == total[i+1]:
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 del total[i+1]
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 else:
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 i = i+1
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 return total
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57
783
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
58
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 # Helper to recognize functions
783
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
60
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 def is_function(x):
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 525
diff changeset
62 return type(x) == type(is_function)
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
783
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
64
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
65 # Approximation of builtin dir(); but note that this lists the user's
430
0f9ebc63dcb5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 # variables by default, not the current local name space.
783
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
67
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 783
diff changeset
68 def dir(x = None):
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 783
diff changeset
69 if x is not None:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 783
diff changeset
70 return listattrs(x)
783
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
71 else:
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
72 import __main__
3e1fbe84cf9f getattr() is now built-in; no longer need a class to simulate varargs.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
73 return listattrs(__main__)