希望我的问题不会让我进入Python耻辱馆。
无论如何,我有一个包poo
,目前只包含一个模块moo
。将来,poo
内可能还有其他模块(例如poo.moose
)。我们假设moo
是一种主要用途模块,并且用户希望在导入moo
时将poo
中的所有内容都准备就绪。我(和我的包用户)希望避免import poo.moo
,import poo.moo as moo
和(喘息!)import poo.*
。你知道,保存打字是一件好事。
所以我的想法(希望不是完全偏离正确的方法)是将模块poo.moo
的“exports”(函数,变量,类,...)复制到包poo
,在__init.py__
。我不想覆盖poo
中的任何现有定义。
实现这一目标的正确,良好,正确和有效的方法是什么? (我使用“理想”吗?不!)或者这是一个坏主意?或者这是一部意气风发的Python,意思是“......现在是完全不同的东西”? ;)
哦,我的软件包只是Python3。
请注意In python, how do you import all classes from another module without keeping the imported module's namespace?有答案,但不明白这是如何适用于Python包的__init__.py
代码的。因此,我在下面的详细答案提供了更多详细信息。
答案 0 :(得分:1)
原来很容易。在包poo/__init__.py
中,只需将(绝对)模块导入包名称空间:
from poo.moo import *
那就是它。现在,如果有poo.moo.a()
,它也可以poo.a()
访问。
请注意,包裹定义不会被(子)模块导入覆盖,我的意图是:poo.moo.version=42
不会覆盖poo.version=13
。究竟需要什么。
我现在注意到,我仍然沉迷于其他模块化语言,其中导入对模块保持私有。但是在Python中,所有内容都是普通的,模块/包中的包导入也是如此。