Get dosctring without import
Joan Miller
peloko45 at gmail.com
Fri Feb 26 06:29:51 EST 2010
On 26 feb, 10:57, Peter Otten <__pete... at web.de> wrote:
> Joan Miller wrote:
> > When a package is imported, it gets the dosctring to store it in
> > *__doc__*.
>
> > Does that funcion is built in python? because I would want use it to
> > get the docstring without import a package
>
> Something to get you started:
>
> import ast
>
> def walk(root, stack):
> for node in ast.iter_child_nodes(root):
> if isinstance(node, (ast.FunctionDef, ast.ClassDef)):
> yield node
> stack.append(node)
> for child in walk(node, stack):
> yield child
> del stack[-1]
>
> def get_name(node):
> try:
> return node.name
> except AttributeError:
> return "(%s)" % node.__class__.__name__
>
> def get_path(path):
> return ".".join(get_name(node) for node in path)
>
> def find_docstrings(filename):
> with open(filename) as f:
> module = ast.parse(f.read())
> print filename.center(len(filename) + 2).center(80, "=")
> print ast.get_docstring(module)
> print "=" * 80
> print
>
> path = []
> for node in walk(module, path):
> s = ast.get_docstring(node)
> if s is not None:
> name = get_path(path + [node])
> print name.center(len(name) + 2).center(80, "-")
> print s
> print
>
> if __name__ == "__main__":
> import sys
> args = sys.argv[1:]
> if args:
> for arg in args:
> find_docstrings(arg)
> else:
> find_docstrings("/usr/lib/python2.6/unittest.py")
> assert "unittest" not in sys.modules
>
> To get an idea of the differences to the import-based approach try analysing
> the following script:
>
> import random
>
> if random.choice([True, False]):
> def f():
> "say hello"
> else:
> def f():
> "kill a kitten"
>
> def g():
> "whatever"
> del g
>
> Peter
Thanks! What I need there is:
---------
with open(os.path.join(path, package, '__init__.py')) as f:
module = ast.parse(f.read())
print ast.get_docstring(module)
More information about the Python-list
mailing list