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卫生。 –