Python3:如何在包级别提供模块导出方便?

时间:2017-08-14 17:17:45

标签: python python-3.x module package

希望我的问题不会让我进入Python耻辱馆。

无论如何,我有一个包poo,目前只包含一个模块moo。将来,poo内可能还有其他模块(例如poo.moose)。我们假设moo是一种主要用途模块,并且用户希望在导入moo时将poo中的所有内容都准备就绪。我(和我的包用户)希望避免import poo.mooimport 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代码的。因此,我在下面的详细答案提供了更多详细信息。

1 个答案:

答案 0 :(得分:1)

原来很容易。在包poo/__init__.py中,只需将(绝对)模块导入包名称空间:

from poo.moo import *

那就是它。现在,如果有poo.moo.a(),它也可以poo.a()访问。

请注意,包裹定义不会被(子)模块导入覆盖,我的意图是:poo.moo.version=42不会覆盖poo.version=13。究竟需要什么。

我现在注意到,我仍然沉迷于其他模块化语言,其中导入对模块保持私有。但是在Python中,所有内容都是普通的,模块/包中的包导入也是如此。