python 2.5有相当于Tcl的uplevel命令吗?

时间:2010-09-25 15:54:48

标签: python tcl uplevel

python是否具有与Tcl的uplevel命令相同的功能?对于那些不知道的人,“uplevel”命令允许您在调用者的上下文中运行代码。以下是它在python中的外观:

def foo():
    answer = 0
    print "answer is", answer # should print 0
    bar()
    print "answer is", answer # should print 42


def bar():
    uplevel("answer = 42")

然而,这不仅仅是设置变量,所以我不是在寻找仅仅改变字典的解决方案。我希望能够执行任何代码。

2 个答案:

答案 0 :(得分:3)

一般来说,你提出的问题是不可能的(你无疑会得到结果)。例如,想象“任何代码”是x = 23。这会为你的调用者的局部变量集添加一个新的变量x,假设你找到了一种黑魔法的方法来“在调用者中”执行这段代码吗?不,它不会 - 由Python编译器执行的关键优化是在def执行时一劳永逸地定义一组精确的局部变量(所有的取消名称)在函数体中分配或以其他方式绑定,并将每个访问和设置转换为非常快速的索引到堆栈帧中。 (你可以系统地击败那个关键的优化,例如在每个可能的调用者的开头都有一个exec '' - 然后看到你的系统性能在整个楼层崩溃了。)

除了用于分配给调用者的本地裸名,exec thecode in thelocals, theglobals可能大致按照您的意愿执行,而inspect模块允许您获取调用者的本地和全局一种半合理的方式(就深黑魔法而言 - 这会让我在任何同事上发邮件表明它是在生产代码中犯下的 - 都可以称得上是称之为“半合理”的不应得的称赞,那是; - )。

但是你确实指定了“我希望能够执行任何代码”。 明确规范的唯一解决方案(并且感谢它如此精确,因为它使答案变得更容易!)是:然后,使用不同的编程语言。

答案 1 :(得分:1)

第三方库是用Python编写的吗?如果是,您可以使用自己的实现在运行时重写和重新绑定函数“foo”。像这样:

import third_party

original_foo = third_party.foo
def my_foo(*args, **kwds):
    # do your magic...
    original_foo(*args, **kwds)
third_party.foo = my_foo

我认为猴子修补比重写框架本地更好。 ;)