2014-04-09 48 views
5
pkg/ 
    __init__.py 
    foo.py 
    bar.py 
    baz.py 

我有一堆foo.py,bar.py和baz.py中的模塊導入相同。跨python包導入

有沒有一種方法可以在__init__.py中進行導入?我需要在foo.py中寫什麼?

回答

1

將進口配置在__init__.py將是一個壞主意; __init__.py被用作模塊對象的內容,所以它是一個公共接口。此外,__init_.py最初是在您的軟件包導入時導入的,而您實際上並不需要導入纔會發生,直到您的子模塊需要它們。

最好的方法是將通用代碼放入一個內部細節模塊中,標記爲單個初始下劃線(意爲「私有」),例如, _imports.py,然後在你的其他文件中寫入from ._imports import *

1

你猜對了這樣做的正確方法,但是我可以讓它更正式一點,並給出(希望)比你在別處找到的更清楚的解釋。如果你想模塊化導入,根據你的編碼哲學本身可能是好的或壞主意(透明性和代碼重用),無論導入是否發生在__init__.py中,都可以從其他腳本導入導入。例如:

"""import_scripts.py""" 
import numpy as np 
import scipy as sp 
... 

"""actual_code.py""" 
from import_scripts import * 
# np and sp are now in scope 

__init__.py導入大多是一樣的,你只是傳統上使用,而不是如果你從同一模塊來訪問它的相對進口:

# To import form __init__ 
from . import * 

重要的是,雖然注意,如果您將這些python腳本明確地作爲模塊運行而不是作爲腳本運行,這些類型的導入將僅適用。這意味着:

python -m foo 

,而不是

python foo.py 

重要,但微妙的區別。

希望有所幫助。如果您還有其他問題,請告訴我。

+0

+1感謝您的微妙區別! – ksindi