是否可以使 `__init__.py` 中的导入对 python `help()` 命令可见?

Slo*_*oke 6 python python-import python-packaging

假设我有一个模块:

mymodule/example.py

def add_one(number):
    return number + 1
Run Code Online (Sandbox Code Playgroud)

mymodule/__init__.py

from .example import *

foo = "FOO"

def bar():
    return 1
Run Code Online (Sandbox Code Playgroud)

现在我在 的根部看到该函数mymodule

>>> import mymodule
>>> mymodule.add_one(3)
4
>>> mymodule.foo
'FOO'
Run Code Online (Sandbox Code Playgroud)

另外,我看到add_one通过dir以下方式导入example

>>> dir(mymodule)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'add_one', 'bar', 'example', 'foo']
Run Code Online (Sandbox Code Playgroud)

但是当我输入时,help(mymodule)我只看到example,foobar,但看不到导入的add_one

Help on package mymodule:

NAME
    mymodule

PACKAGE CONTENTS
    example

FUNCTIONS
    bar()

DATA
    foo = 'FOO'
Run Code Online (Sandbox Code Playgroud)

但我可以调用add_one()作为 的根函数mymodule。是否可以在帮助中看到它作为根函数?

Ron*_*uya 3

来自 help() 的源代码(pydoc.py 下的 docmodule

        for key, value in inspect.getmembers(object, inspect.isroutine):
            # if __all__ exists, believe it.  Otherwise use old heuristic.
            if (all is not None or
                inspect.isbuiltin(value) or inspect.getmodule(value) is object):
                if visiblename(key, all, object):
                    funcs.append((key, value))
Run Code Online (Sandbox Code Playgroud)

重要的是inspect.getmodule(value) is object),这是不直接属于对象本身的值被删除的地方

您可以添加这一行

__all__ = ['bar', 'add_one', 'FOO']
Run Code Online (Sandbox Code Playgroud)

到您的__init__.py文件,这样帮助功能将确保在帮助中包含这些对象

请记住,如果您执行此操作,则您未包含在此列表中的任何内容都不会包含在内