使用"from x import *"文档化文件

4 投票
1 回答
550 浏览
提问于 2025-04-17 08:51

可以使用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中,包含了betamzjn

但是如果

beta.__module__ = "pylab"

被添加到pylabtest.py中,只有mzjn会被记录。

撰写回答