2012-10-20 55 views
1

这是可能的(尽管通常不是一个好主意)来创建存储在globals()其成员定义一个类或其他词典:python函数如何将所有变量放在全局名称空间中?

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

有没有办法做一个功能相同的,所以所有的它的局部变量存储在全局(或模块)名称空间中,而不是它自己的?

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

def myfunction(): 
    global x 
    x = 10 

什么我要找的是实现所有的内部变量相同的效果一般方式myfunction(也适用于尚未在顶部声明的人),理想情况下某种单线程可轻松添加,然后在不再需要时删除。

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

+0

为什么你希望你的函数在被调试时以完全不同的方式运行?你冒险从一个函数的'x'干扰另一个函数。 – r3m0t

+2

为什么不使用调试器作为调试帮助? – Keith

+0

如果某个函数在管理复杂数据结构过程中引发异常,则与IDLE捆绑在一起的调试器无法完成检查剩余部分的任务。 (的确,一个体面的调试器会使这个不确定)。但是可以从解释器提示中检查全局变量。我只为这个即将崩溃的功能(手动)执行此操作,所以没有风险。 – alexis

回答

1

这工作

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


>>> test() 

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

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

+0

谢谢,但这只是简单地将_copies_值赋给全局命名空间;如果值发生变化或者我定义了更多变量,则全局值将不会跟踪它们。 – alexis

+0

@alexis这不太对。这将在全局名称空间中的本地变量中指定名称。如果你改变它们中的一个,即'z = []',那么'globals ['z'] = z'然后'z.append(1)',它会被反映出来。只有当你将__replace__中的一个名称指向一个新对象,即'x + = 1'或'y.replace('','_')'时,才会反映出来。更简单的版本是'globals()。update(locals())'。 – agf

+0

您希望从全局空间中看到函数的本地人。如何在不调用函数的情况下更改本地值? 此外,当你离开函数时局部变量被破坏;处理代码的人应该知道这一点。您可以通过我所建议的技术来保存它们的值,但是变量本身并不存在 - 它们在堆栈上创建并在函数返回时清除。 – volcano

相关问题