3

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")

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

4

2 回答 2

3

一般来说,你所问的都是不可能的(毫无疑问,你所期望的结果)。例如,想象“任何代码”是x = 23. x假设您确实找到了一种“在调用者中”执行此代码的神奇方法,这是否会为调用者的局部变量集添加一个新变量?不,它不会——Python 编译器执行关键优化是在执行时一劳永逸地定义一def组精确的局部变量(在函数体中分配或绑定的所有裸名),并将对这些裸名的每次访问和设置都转换为对堆栈帧的非常快速的索引。(您可以系统地击败关键优化,例如通过exec ''在每个可能的调用者开始时 - 并因此看到系统的性能崩溃)。

除了分配给调用者的本地裸名之外,exec thecode in thelocals, theglobals可以大致做你想要的,并且该inspect模块让你以半合理的方式获取调用者的本地和全局(就深黑魔法而言——这会让我去任何同事都建议在生产代码中执行此操作的邮件--永远不会因为称其为“半合理”而受到不应有的赞誉,也就是说;-)。

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

于 2010-09-25T17:03:28.213 回答
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

我猜猴子修补比重写框架本地人要好一些。;)

于 2010-09-25T17:17:14.007 回答