繁体   English   中英

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

[英]Python namespace in between builtins and global?

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

内置-此名称空间在整个解释器以及在解释器实例中运行的所有脚本都是全局的。

全局变量-此命名空间在整个模块(即单个文件)中是全局的。

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

例如,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的调用者施加了约束,以公开其日志对象。

谢谢保罗

内建函数和全局变量之间没有名称空间-但您可以轻松创建自己的名称空间并将其以名称插入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 Zen的最后一行(又名import this )所说的那样:

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

您可以最简单地制造和使用“更多”产品-只需限定您的名字 (将它们放在属于它们的适当名称空间中!),而不是坚持不适合它们的裸名。 拥有合格名称的事情不计其数,这很容易,对于那些被困在裸名上的人来说,这是非常困难的问题,几乎是不可能的!-)

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

实际上,我确实弄清楚了要寻找的东西。

该技巧实际上是PLY所使用的,这是偶然发现的地方。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM