目前我们有一个类似于以下内容的Python库:
Jupiter/
__init__.py
Ganymede.py
Callisto.py
Ganymede.py
反过来包含功能Foo()
,Bar()
等等。我们现有的脚本通过使用这些功能
from Jupiter import Ganymede
# later in the program...
Ganymede.Foo()
我想重新组织事情,以便目录看起来更像
Jupiter/
__init__.py
Ganymede/
__init__.py
functions.py
Callisto/
__init__.py
functions.py
不破坏或修改任何使用Jupiter的现有脚本。
如果Ganymede/__init__.py
使用“导入系统”文档中描述的导入语法:
from .functions import *
然后Foo()
并Bar()
最终在木卫三的命名空间,但help()
对木卫三没有提到他们。
>>> from Jupiter import Ganymede
>>> dir(Ganymede)
['Bar', 'Foo', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'functions']
>>> help(Ganymede)
Help on package Jupiter.Ganymede in Jupiter:
NAME
Jupiter.Ganymede
PACKAGE CONTENTS
functions
FILE
x:\yadda\yadda\ganymede\__init__.py
我真的非常希望help(Ganymede)
自动列出所有可用的函数和类。
我想我可以execfile("functions.py")
,Ganymede/__init__.py
但我觉得必须有一些更清洁的方法来做到这一点。或者没有?
我需要一些适用于Python 2.7.15和3.5.3的东西。
发布于 2018-09-25 16:24:32
创建一个__all__
在__init__.py
。
如果你已经有了一个__all__
在functions.py
,你可以将其导入:
from .functions import *
from .functions import __all__
如果要将多个模块合并在一起,则必须更加冗长
from .functions import *
from .classes import *
from . import functions
from . import classes
__all__ = functions.__all__ + classes.__all__
或者,当然,您可以始终明确:
from .functions import *
__all__ = ['spam', 'eggs']
或者,如果您想动态构建它:
from .functions import *
from . import functions
__all__ = [name for name in dir(functions) if not name.startswith('_')]
......或者(非常hacky-但是如果你有一个__init__.py
从很多子模块中收集名称并且什么都不做的话,有时很有用)......
from .functions import *
__all__ = [name for name in globals() if not name.startswith('_')]
请记住,这__all__
也会影响某人执行操作时发生的事情from Ganymede import *
(事实上,这是其主要目的__all__
),以及哪些inspect
工具和其他工具报告为您的包的公共成员。
我不确定help
在没有__all__
任何地方记录的行为是否存在于任何地方(交互式help
作品通常只是轻微记录......),并且它与import
考虑公开的内容并不完全相同。
https://stackoverflow.com/questions/-100006157
复制相似问题