2

有没有一种简单的方法可以.py通过显示其函数 API 和docstring's 来将 a 转换为 HTML?我阅读了 Sphinx - 但这似乎是一个大项目。我只是想找到一种方法来从.py仅具有函数定义和docstring.

4

2 回答 2

2

你可以在没有任何工具的情况下做到这一点。首先,您需要获取数据。这是一个非常基本的例子:

"""My module"""

def foo():
    """Some function"""
    pass

def bar():
    """Another function"""
    pass

class Spam(object):
    """Some object"""
    pass

if __name__ == '__main__':
    import types

    defs = set(locals().keys()).difference(set(__builtins__.keys())) 

    if __doc__:
        print 'Module:'
        print __doc__, '\n'

    for name in defs:
        object_ = locals()[name]
        if type(object_) is types.FunctionType:
            print "Function %s:" % object_.__name__
            print object_.__doc__, '\n'
        elif type(object_) is type:
            print "Class %s:" % object_.__name__
            print object_.__doc__, '\n'

输出将是:

Module:
My module 

Function bar:
Another function 

Class Spam:
Some object 

Function foo:
Some function 

要获取 html,您可以使用模板引擎,例如Mako。制作一个模板并将数据传递__doc__给它,这应该可以完成这项工作。

编辑:这是从函数中获取签名的方法:

>>> def foo(spam, eggs):
...     bar = spam + eggs
...     return bar
>>> varnames = foo.func_code.co_varnames
>>> argcount = foo.func_code.co_argcount
>>> '%s(%s)' % (foo.__name__, ', '.join(varnames[:argcount]))
0: 'foo(spam, eggs)'
于 2013-02-20T10:39:36.740 回答
1

我的手写 api 文档处理程序会做类似的事情。

import inspect
inspect.getmembers(MyClass, predicate=inspect.ismethod)

将返回所有可用方法的列表。第一个对象是方法名称的字符串表示形式,因此您可以使用简单的过滤器函数来过滤掉其中的一些。我的 api 过滤掉以_(它们是内部方法,不能从 api 访问)开头的方法,比如

    filter(lambda x: not x.startswith('_'), [x[0] for x in inspect.getmembers(MyClass, predicate=inspect.ismethod)])

第二个对象是相关方法的实例方法。您可以使用它来调用__doc__以获取文档字符串或您可以使用方法实例调用的任何其他方法

for item in inspect.getmembers(MyClass, predicate=inspect.ismethod):
    print item[0]
    print item[1].__doc__
于 2013-02-20T11:07:09.257 回答