【问题标题】:How can a python function put all its variables in the global namespace?python 函数如何将其所有变量放在全局命名空间中?
【发布时间】:2012-10-20 23:13:19
【问题描述】:

可以(虽然通常不是一个好主意)创建一个将其成员定义存储在globals() 或其他字典中的类:

oddclass = type("oddclass", (object,), globals())

有没有办法对函数做同样的事情,使其所有的局部变量都存储在全局(或模块)命名空间中,而不是它自己的?

通过声明变量global,我可以一次获得一个变量的相同效果:

def myfunction():
    global x
    x = 10

我正在寻找的是一种通用方法来为myfunction 的所有内部变量(也适用于那些尚未在顶部声明的变量)实现相同的效果,理想情况下是某种可以轻松添加并在不再需要时移除的单衬里。

PS。我问这个问题是因为我很好奇 python 管理函数命名空间的方式。我的动机是在某些情况下将其用作临时调试帮助(具有大量本地数据的函数神秘地失败了),但不要介意:我可以像上面那样使用global .这个问题是关于python函数内部的。

【问题讨论】:

  • 为什么您希望您的函数在调试时以完全不同的方式运行?您冒着x 来自一个功能干扰另一个功能的风险。
  • 为什么不使用调试器作为调试辅助工具?
  • 如果函数在管理复杂数据结构的过程中引发异常,则与 IDLE 捆绑的调试器无法完成检查剩余部分的任务。 (确实,一个体面的调试器会使这变得不必要)。但是可以从解释器提示符中检查全局变量。我只(手动)为即将崩溃的一个功能执行此操作,因此没有风险。
  • 我已经调试了很多 Python,但从来没有这样做过。但后来我开发了自己的调试器和自动调用它的方法。见:code.google.com/p/pycopia/source/browse/…
  • 有趣...好吧,那么您必须同意内置调试器还有一些不足之处! :-)

标签: python metaclass


【解决方案1】:

这行得通

>>> def test():
    x = 10
    y = 'Some string'
    for k, v in locals().items():
        globals()[k] = v


>>> test()

>>> x
10
>>> y
'Some string'

请记住,这是非常不安全的技术,绝不应该使用

【讨论】:

  • 谢谢,但这只是将值复制到全局命名空间;如果值发生变化或者我定义了更多变量,全局值将不会跟踪它们。
  • @alexis 这不太对。这将全局命名空间中的名称指向局部变量。如果您更改其中之一,即z = [] 然后globals['z'] = z 然后z.append(1),它将被反映。只有当您替换其中一个时,通过将名称指向一个新对象,即x += 1y.replace(' ', '_'),它不会被反映。更简单的版本是globals().update(locals())
  • 您希望在全局空间中看到函数中的局部变量。如何在不调用函数的情况下更改局部值?此外,当您离开函数时,局部变量会被破坏;任何处理代码的人都应该知道这一点。您可以通过我建议的技术保留它们的值,但变量本身不存在 - 它们是在堆栈上创建的,并在函数返回时被清除。
  • @agf,谢谢我明白这一切。对本地名称的任何分配也会破坏对应关系。将我要跟踪的变量声明为 global 更加健壮。但我问这个问题是因为我很确定我已经看到它完成了,我很好奇是怎么做的。
  • @volcano,由于我的函数超过两行,局部变量将被更改。如果变量存储在全局命名空间中,则不会破坏任何内容。无论如何,谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 2011-03-25
  • 1970-01-01
  • 2014-02-17
  • 2012-08-02
  • 2011-08-31
  • 2017-01-04
  • 2019-07-07
相关资源
最近更新 更多