tl; dr:如何在某些__init__.py
中創建新的名稱空間,並將其他名稱空間的選擇位複製到其中,而不需要新目錄中的子模塊?維護整潔的名稱空間
全部問題:
比方說,我有一個對模塊的封裝,目錄結構如下:
foo/mod_1.py
foo/mod_2.py
foo/__init__.py
mod_1.py
如下:
import numpy
__all__ = ['test1']
def test1():
return numpy.zeros(10)
mod_2.py
如下:
import numpy
def test2():
return numpy.zeros(20)
和__init__.py
如下:
from mod_1 import *
import mod_2
del mod_1
這產生更多或更少的所需名稱空間:
In [7]: dir(foo)
Out[7]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'__path__',
'mod_2',
'test1']
除即numpy
現在是在foo.mod_2
命名空間。如果我試圖在__init__.py
和del mod_2.numpy
中刪除它,那麼該模塊將不再存在,因此mod_2.test2
已損壞。
我可以通過創建一個包含mod_2.py
的額外目錄mod_2
來達到我想要的效果,但是我希望儘可能保持目錄結構不變。
因此我的第一個問題。
編輯:我不介意做一點點名字來阻止一個名字踩在另一個名字上。假設將mod_2.py
的相關位分成foo._mod_2
。
'del mod_1'將引發'NameError'異常,您沒有導入'mod_1',您導入了包含*在*'mod_1'中的名稱。 –
爲什麼存在'mod_2.numpy'這個問題? –
@MartijnPieters no NameError(我認爲是因爲mod_1隱含地作爲包的一部分)。由於OCD衛生。 –