【发布时间】:2012-11-29 13:36:37
【问题描述】:
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,而是导入了包含在inmod_1中的名称。 -
为什么
mod_2.numpy存在是个问题? -
@MartijnPieters no NameError (我假设因为 mod_1 作为包的一部分隐含地存在)。因为强迫症的卫生。
标签: python namespaces