2009-12-01 162 views
5

假設你有以下自包含或不包含子包?

b 
b/__init__.py 
b/c 
b/c/__init__.py 
b/c/d 
b/c/d/__init__.py 

在一些Python包,如果你import b,你只能得到B中定義的符號。要訪問b.c,您必須明確地使用import b.cfrom b import c。換句話說,你必須

import b 
import b.c 
import b.c.d 
print b.c.d 

在其他情況下,我看到一個自動導入所有的子包。這意味着下面的代碼不會產生錯誤

import b 
print b.c.d 

因爲b/__init__.py需要進口及其子包的護理。 我傾向於喜歡第一個(明確優於隱含),我總是使用它,但是有沒有第二個優先於第一個的情況?

回答

5

我喜歡命名空間 - 所以我認爲import b應該只能得到b本身(推測在b/__init__.py)。如果有理由將b.c,b.c.d或其他功能中的其他功能分開,那麼只需import b不應該將其全部拖入 - 如果「全部拖入」確實發生,我認爲這表明名稱空間分離可能是假的一開始。當然,甚至在標準庫中也有例子(import os,然後你可以使用os.path.join之類),但它們是古老的,到現在爲止,在Python封裝系統成熟和穩定之前,這些東西基本上是「祖先的」東西。在新的代碼中,我會強烈建議一個包應該而不是當你導入它的時候拖動它的子包。 (在Python提示符下執行import this並考慮它顯示的最後一行;-)。

0

__all__ = [您的增值經銷商,函數,類]

使用在程序包B的__init__.py在字典上市的汽車負載的東西上面的語法。 :)