我想要某個模塊的接口包含一定數量的函數和類(而不是其他)。我可以在一個文件中實現所有這些,並且很容易獲得我想要的接口。但是,由於有大量的代碼,我寧願分裂了整個事情分成幾個文件,說如何將子模塊名稱保留在Python包的名稱空間之外?
mypackage/
__init__.py
a.py
b.py
c.py
d.py
如果想獲得理想的界面,我定義一個__init__.py
文件爲導入所有公共包從a
,b
,c
和d
符號:
from a import func_a1, func_a2, ClassA1, ClassA2
from b import func_b1, func_b2, ClassB1, ClassB2
from c import func_c1, func_c2, ClassC1, ClassC2
from d import func_d1, func_d2, ClassD1, ClassD2
如果我導入使用
import mypackage
包
包名稱空間還包含符號a
,b
,c
和d
。這些名稱是實現細節,不屬於我的界面。我不希望它們顯示爲「公共」符號。什麼是擺脫他們的最佳方式?
我考慮的選擇是
使用一個單獨的模塊,而不是包裝。界面看起來很好,但是實現會比現在更清晰。
行
del a, b, c, d
加入的
__init__.py
末。工作正常,但看起來像一個黑客。 (例如,你不能import __init__
更多,如果沒有此項線路正常。)重命名
a
,b
,c
和d
到_a
,_b
,_c
和_d
。現在它們被包含在mypackage
的命名空間中作爲「私有」符號,我很好,但它感覺有點奇怪,我的文件名以開頭, )。
有什麼更好的建議嗎?或者想要選擇哪個選項?
或者我只是爲了肛門,不應該關心整個事情?
不妨去喝蘇打水。也就是說,除了你以外,沒有人真正關心包的命名空間中的內容。 – 2011-03-10 20:29:24
@Ignacio:可能你是對的:)例如在交互式使用中,當不需要的名稱會干擾標籤擴展時,它會讓我感到惱火。 – 2011-03-10 20:37:21
這只是我的看法,但是'import __init__'在選項2中似乎更加駭人聽聞,所有事情都考慮到了。 – JAB 2012-06-07 15:09:20