Python code for documenting Python classes?
Michael Hudson
mwh21 at cam.ac.uk
Tue Jan 18 05:10:22 EST 2000
T. Bridgman <wtbridgman at radix.net> writes:
> Just so I don't try to re-invent the wheel...
>
> Does anyone know of a Python program for documenting Python classes?
No, but I've whipped something up. The script at the end of this post
scans through the methods of a class and collects a list of attributes
that are assigned to self.
E.g:
>>> class A:
def __init__(self,a):
self.b = a
self.c = 1
self.e = "orange"
def meth2(a,b): # even works if you don't call it self!
a.confuse = b
>>> classdoc.do_class(A)
['b', 'c', 'confuse', 'e']
It uses bytecodehacks, so get that here: (where I've just uploaded a
new version with a couple fixes)
http://starship.python.net/crew/mwh/
(it could be written just using dis, but not as quickly)
It only does the class in question; it could be trivially modified to
recurse into base classes (but only Python ones, I'm afraid).
This is a fairly maximal set of data members; you could just scan
__init__ for a more minimal set. Trying to work out which members will
always be set is a job for someone else (maybe someone who can solve
the halting problem...).
It also makes no attempt to determine the type of member (that would
be *hard*), or format the output (this should be easy).
enough-caveats-for-one-post-ly y'rs
Michael
--- this is classdoc.py:
from bytecodehacks.code_editor import InstanceMethod
from bytecodehacks.ops import *
import types
def do_method(meth):
code = InstanceMethod(meth).im_func.func_code
ops = code.co_code
varnames = code.co_varnames
names = code.co_names
ans = []
for i in range(len(ops)):
op = ops[i]
if op.__class__ is LOAD_FAST:
if op.arg == 0: # self is the first posarg
if ops[i+1].__class__ is STORE_ATTR:
name = names[ops[i+1].arg]
if name not in ans:
ans.append(name)
return ans
def do_class(klass):
ans = []
for m in dir(klass):
a = getattr(klass,m)
if type(a) is types.MethodType:
for i in do_method(a):
if i not in ans:
ans.append( i )
ans.sort()
More information about the Python-list
mailing list