Skip to main content
 首页 » 编程设计

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

2024年08月12日34webabcd

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

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

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 的调用者施加了限制以公开其日志对象。

谢谢, 保罗

请您参考如下方法:

“内置”和全局“之间”没有 namespace ——但您可以轻松创建自己的 namespace 并将它们与名称一起插入 sys.modules 中,因此任何其他模块都可以“导入”它们(理想情况下不使用from ... import 语法,它会带来很多问题,绝对不使用 tghe 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 之禅(又名 import this)的最后一行所说:

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

您可以最简单地创建和使用“更多”——只需限定您的名称(将它们放在它们属于的正确命名空间中!)而不是坚持在他们不适合的裸名上。有无数的事情,只要有合格的名字就很容易,而且对于那些坚持使用裸名的人来说,在严重问题和几乎不可行之间的任何地方!-)