1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import string
26 from dis import opname, HAVE_ARGUMENT
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 CO_OPTIMIZED = 0x0001
56 CO_NEWLOCALS = 0x0002
57 CO_VARARGS = 0x0004
58 CO_VARKEYWORDS = 0x0008
59
61
62
63 code = func.func_code
64
65 n = code.co_argcount
66 a = list(code.co_varnames[:n])
67 p = 0
68 for i in range(n):
69
70 c = code.co_code
71 if not a[i] or a[i][0] == ".":
72 vars = []
73 while p < len(c):
74 v = ord(c[p])
75 if v >= HAVE_ARGUMENT:
76 s, v = opname[v], ord(c[p+1]) + ord(c[p+2])*256
77 p = p + 3
78 if s in ("UNPACK_SEQUENCE", "UNPACK_TUPLE"):
79 count = v
80 elif s == "STORE_FAST":
81 vars.append(code.co_varnames[v])
82 if len(vars) >= count:
83 break
84 else:
85 p = p + 1
86 if vars:
87 a[i] = "(" + string.join(vars, ", ") + ")"
88 if func.func_defaults:
89
90 i = n - len(func.func_defaults)
91 for d in func.func_defaults:
92 a[i] = (a[i], d)
93 i = i + 1
94 if code.co_flags & CO_VARARGS:
95
96 a.append("*"+code.co_varnames[n])
97 n = n + 1
98 if code.co_flags & CO_VARKEYWORDS:
99
100 a.append("**"+code.co_varnames[n])
101 n = n + 1
102 return a
103
105 "Return the function or method declaration as a string"
106
107
108 a = describeParams(func)
109 args = []
110 for arg in a:
111 if type(arg) == type(""):
112 args.append(arg)
113 else:
114 args.append("%s=%s" % (arg[0], repr(arg[1])))
115 args = string.join(args, ", ")
116
117
118 if not name:
119
120
121 name = func.__name__
122 if name == "<lambda>":
123 return "lambda %s" % args
124 return "%s(%s)" % (name, args)
125
133
135 "Return a dictionary describing all methods available in a class"
136
137 m = {}
138 __getmethods(cls, m)
139 return m
140
142 "Return a dictionary describing all methods available in an instance"
143
144 return describe_class(self.__class__)
145
146
147
148
149 if __name__ == "__main__":
150
151 - def foo(a, b=1, *c, **d):
152 e = a + b + c
153 f = None
154
155 bar = lambda a: 0
156
157
158 - def baz(a, (b, c) = ('foo','bar'), (d, e, f) = (None, None, None), g = None):
160
161 print "describeParams(foo)", describeParams(foo)
162 print "describeParams(bar)", describeParams(bar)
163 print "describeParams(baz)", describeParams(baz)
164
165 print describe(foo)
166 print describe(bar)
167 print describe(baz)
168