2

我想将我的命名空间从说 sandbox.auto.tools缩短到sandbox.tools。我该如何实现(自动是多余的)?我查看了其他消息,但并没有真正找到与我正在寻找的内容相似的内容。下面是我的目录结构。

sandbox\auto\tools\foo.py (contains a function display() as described below)
    def display():
        print "hello"

sandbox\test\bar.py 
    import sandbox.auto.tools as sandbox.tools (Error)

我知道我可以做到以下几点。

  sandboox\test\bar.py 
    from sandbox.auto.tools import foo as tools
    tools.display()

有什么建议/指针吗?

4

4 回答 4

3

允许您指定的确切语法(使用sandbox.tools而不是sandbox_tools)将需要在导入模块之前或之后更改模块。

便宜的方法:

import sandbox.auto.tools
sandbox.tools = sandbox.auto.tools

永久方式(需要能够修改模块源):

sandbox/__init__.py在源中创建或更改说:

import auto.tools as tools
__all__ = ['tools', ...]
于 2012-06-21T16:57:16.607 回答
0

我的一位同事指出,我们可以将以下行添加到 sandbox/ init .py,它应该可以解决这个特定问题。

路径.append('沙盒/自动')

于 2012-06-27T20:25:32.530 回答
0

我终于找到了您的建议/帮助的解决方案。但是,我仍然不满意。

沙盒/初始化.py

import auto.tools as tools
__all__ = ['tools']

import sandbox.auto.tools.foo
sandbox.tools.foo = sandbox.auto.tools.foo

sandbox/test/bar.py - 这似乎工作

import sandbox
print dir(sandbox)
foo = sandbox.tools.foo
foo.display()

然而——我不能再说这样的话了

from sandbox.tools import foo
or
from sandbox.tools import foo as tools2

看起来我能够处理引用,但我仍然不完全理解 python 中命名空间的概念。

于 2012-06-22T12:42:37.090 回答
0

如果您真的想sandbox.tools有空,请将其添加到sandbox/__init__.py

from .auto import tools

这将添加toolssandbox包的命名空间中,您将能够执行此操作:

from sandbox import tools
tools.dispaly()

或者,您要求的是:

import sandbox
sandbox.tools.display()
于 2012-06-21T16:56:01.663 回答