2016-06-13 38 views
3

在Python約定中,模塊的導入應該被認爲是它的公共接口的一部分嗎?python import - public or private convention

我有一些代碼,這是否:

foo.py

from a import b 

bar.py

from foo import b 

我試圖決定是否重構bar.py直接從a中導入b。我想可能有些情況下你想讓foo.py來控制bar.py使用的b的實現。但是,如果情況並非如此,那麼讓兩個模塊以相同的方式導入模塊不是更好的做法嗎?

+0

。此外,這個問題似乎有點基於意見,如果你可以想出一種方式來重新修飾它,使其更加客觀,防止這種情況被作爲主題關閉。 –

回答

2

在Python約定中,模塊的導入應該被認爲是它的公共接口的一部分嗎?

模塊的公共API是模塊記錄其公共API的地方。如果模塊foo提供文件b,則b是其公共API的一部分,無論是b實際上是在foo中定義的還是從別處導入的。

許多模塊將他們的代碼分成多個文件並將所有的部分一起導入到一個模塊中。例如,collections模塊把它的代碼的一部分在C _collections模塊和確實

from _collections import deque, defaultdict 

dequedefaultdict是明確collections的公共API的一部分。

如果一個模塊導入的東西不應該是其公共API的一部分,那麼通過import thing as _thing做一個下劃線通常是一個好主意,表示導入的東西是一個實現細節。

2

文檔的觀點。約定是所有不以下劃線開始的東西都是公開的。如果要將導入符號標記爲私有,則使用下劃線別名,如from a import b as _b。還有一個選擇。您可以使用__all__來聲明您認爲公開的符號。儘管技術上它隻影響from module import *,但它也是一個很好的意向聲明。

依賴性的觀點。如果沒有強有力的理由,我不會推薦複雜的依賴關係圖,因爲否則在開發過程中稍後會遇到循環導入問題的機會較大。

Zen of Python明確優於隱式簡單比複雜好。因此,如果模塊a提供了符號b,那麼使用ba導入它的所有模塊都是合理的。

0

忍者模式模塊定義

def defmod(): 
    global foo 
    import sys 
    def foo(): return sys.path 
defmod() 
del defmod 
如果你想使他們的私人你總是可以做`進口B中_b`