2017-08-14 91 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中,所有的都是普通的視圖,包導入模塊/包也是如此。

相關問題