使用"from x import *"文档化文件
可以使用sphinx的.. automodule::和其他自动化功能来记录包含from x import *
语句的模块,而不包括被导入模块的所有文档吗?
编辑:根据mzjn的观点,只要被导入的方法的__module__
属性与模块名称不同,它们就不应该被记录。然而,对于我的一些模块,它们是相同的。
我的MLE只是一个名为test_doc.py
的文件,里面有以下一行:
from pylab import *
还有文档:
.. automodule:: agpy.test_doc
:members:
如果我在test_doc.py
中加入这一行:
print "beta.__module__:",beta.__module__
我得到了预期的结果:
beta.__module__: None
有人知道发生了什么吗?我是不是在conf.py
中搞错了什么?
编辑:根据mzjn的回答,提供了一个解决方法,就是改变那些__module__==None
的函数的__module__
属性:
import pylab
from pylab import *
for k,v in pylab.__dict__.iteritems():
if hasattr(v,'__module__'):
if v.__module__ is None:
locals()[k].__module__ = 'pylab'
1 个回答
4
是的,这样应该没问题。根据文档的说明:
在使用automodule指令时,如果设置了成员选项,只有那些
__module__
属性等于automodule中给出的模块名的模块成员才会被记录。这是为了避免记录导入的类或函数。
更新:
问题似乎出在许多pylab
成员的__module__
属性是None
(根据我的了解,这些成员是在C/Cython模块mtrand
中定义的)。
mtrand
模块是NumPy的一部分。在后台,pylab.beta
(以及其他几个函数)其实是numpy.random.mtrand.RandomState
类的方法。我可以通过以下方式重现这个文档问题:
使用这个源文件(pylabtest.py)
from pylab import beta
def mzjn(x):
"""mzjn docstring"""
return x
以及这个源文档(pylabtest.rst)
Pylab test
==========
.. automodule:: pylabtest
:members:
在生成的pylabtest.html中,包含了beta
和mzjn
。
但是如果
beta.__module__ = "pylab"
被添加到pylabtest.py中,只有mzjn
会被记录。