2017-08-14 45 views
0

希望我的问题不会让我进入蟒蛇大厅。Python3:如何在包级别方便地提供模块导出?

无论如何,我有一个包poo,目前只包含一个模块moo。将来,poo内可能还有其他模块(例如poo.moose)。假设moo是一种主要使用模块,并且用户想要在导入poo时准备好所有内容(moo)。我(和我的包用户)想避免import poo.moo,import poo.moo as moo和(gasp!)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

可能重复[在python中,如何在不保留导入模块的名称空间的情况下从其他模块导入所有类?](https://stackoverflow.com/questions/11980062/in-python-how-do-you- import-all-classes-from-another-modules-without-keeping-the) – ppperry

+0

@ppperry不幸的是,'from x import * as *'不适用于Python3。 – TheDiveO

+0

删除'as *'。 – ppperry

回答

1

原来真的很简单。在包poo/__init__.py简单,做模块的这个(绝对)导入到包命名空间:

from poo.moo import * 

就是这样。现在,当有​​时,它也将变为poo.a()

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

我现在注意到,我仍然被那些其他模块化语言添加了其他模块化语言,其中导入保留私人模块。但是在Python中,所有的都是普通的视图,包导入模块/包也是如此。

相关问题