首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让Python模块的__init__.py将其help()委托给兄弟文件?

如何让Python模块的__init__.py将其help()委托给兄弟文件?
EN

Stack Overflow用户
提问于 2018-09-25 06:32:13
回答 1查看 0关注 0票数 0

目前我们有一个类似于以下内容的Python库:

代码语言:javascript
复制
Jupiter/
  __init__.py
  Ganymede.py
  Callisto.py

Ganymede.py反过来包含功能Foo()Bar()等等。我们现有的脚本通过使用这些功能

代码语言:javascript
复制
from Jupiter import Ganymede
# later in the program...
Ganymede.Foo()

我想重新组织事情,以便目录看起来更像

代码语言:javascript
复制
Jupiter/
  __init__.py
  Ganymede/
    __init__.py
    functions.py
  Callisto/
    __init__.py
    functions.py

不破坏或修改任何使用Jupiter的现有脚本。

如果Ganymede/__init__.py使用“导入系统”文档中描述的导入语法:

代码语言:javascript
复制
from .functions import *

然后Foo()Bar()最终在木卫三的命名空间,但help()对木卫三没有提到他们。

代码语言:javascript
复制
>>> 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的东西。

EN

回答 1

Stack Overflow用户

发布于 2018-09-25 16:24:32

创建一个__all____init__.py

如果你已经有了一个__all__functions.py,你可以将其导入:

代码语言:javascript
复制
from .functions import *
from .functions import __all__

如果要将多个模块合并在一起,则必须更加冗长

代码语言:javascript
复制
from .functions import *
from .classes import *
from . import functions
from . import classes
__all__ = functions.__all__ + classes.__all__

或者,当然,您可以始终明确:

代码语言:javascript
复制
from .functions import *
__all__ = ['spam', 'eggs']

或者,如果您想动态构建它:

代码语言:javascript
复制
from .functions import *
from . import functions
__all__ = [name for name in dir(functions) if not name.startswith('_')]

......或者(非常hacky-但是如果你有一个__init__.py从很多子模块中收集名称并且什么都不做的话,有时很有用)......

代码语言:javascript
复制
from .functions import *
__all__ = [name for name in globals() if not name.startswith('_')]

请记住,这__all__也会影响某人执行操作时发生的事情from Ganymede import *(事实上​​,这是其主要目的__all__),以及哪些inspect工具和其他工具报告为您的包的公共成员。

我不确定help在没有__all__任何地方记录的行为是否存在于任何地方(交互式help作品通常只是轻微记录......),并且它与import考虑公开的内容并不完全相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档