内置和全局之间的Python命名空间?

时间:2010-06-09 23:15:46

标签: python namespaces module global-variables

据我了解,python具有以下最外层的命名空间:

Builtin - 此命名空间在整个解释器和解释器实例中运行的所有脚本中是全局的。

Globals - 此命名空间跨模块是全局的,即跨单个文件。

我正在寻找这两者之间的命名空间,在这里我可以将主脚本中声明的一些变量共享给它调用的模块。

例如,script.py:

import Log from Log
import foo from foo

log = Log()
foo()

foo.py:

def foo():
    log.Log('test')  # I want this to refer to the callers log object

我希望能够多次调用script.py,并且在每种情况下,将模块级日志对象公开给foo方法。

如果有可能,有什么想法吗?

传递日志对象不会太痛苦,但我正在使用从Javascript移植的大量代码。我也明白,这会对foo的调用者施加约束以暴露其日志对象。

谢谢, 保罗

3 个答案:

答案 0 :(得分:4)

在builtins和globals之间没有名称空间 - 但你可以轻松地创建自己的名称空间并在sys.modules中插入名称,因此任何其他模块都可以“导入”它们(理想情况下使用带有大量问题的from ... import语法,并且绝对不使用您发明的import ... from语法,这只会产生语法错误)。例如,在script.py

import sys
import types
sys.modules['yay'] = types.ModuleType('yay')

import Log
import foo

yay.log = Log.Log()
foo.foo()

并在foo.py

import yay

def foo():
  yay.log.Log('test')

不要害怕有资格的名字 - 他们善良!或者作为Python的禅宗的最后一行(AKA import this)说明:

Namespaces are one honking great idea -- let's do more of those!

您可以最简单地制作和使用“更多这些” - 只需限定您的名字(将它们置于他们属于的正确命名空间中!)而不是坚持在裸名,他们只是不合适。有一些非常容易使用合格名称的东西,并且在那些严重存在问题的情况下,对于那些坚持不知名的人来说几乎不可行! - )

答案 1 :(得分:0)

没有这样的范围。您需要添加到内置范围,或传递相关对象。

答案 2 :(得分:0)

实际上,我确实弄明白了我在寻找什么。

这个黑客实际上是用PLY而且偶然发现了。

库代码可以引发运行时异常,然后可以访问调用者堆栈。