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