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")然而,它不仅仅是设置变量,所以我并不是在寻找一个仅仅改变字典的解决方案。我希望能够执行任何代码。
发布于 2010-09-26 01:03:28
一般来说,你所要求的是不可能的(结果无疑是你所期望的)。例如,假设“任何代码”都是x = 23。假设您确实找到了一种神奇的方法来“在调用者中”执行这段代码,这会不会向调用者的局部变量集中添加一个新的变量x?不,它不会-- Python编译器执行的关键优化是,当def执行时,一次性地定义确切的局部变量集(在函数体中分配或以其他方式绑定的所有barenames ),并将对这些barenames的每次访问和设置转换为非常快速的索引到堆栈框架中。(您可以系统地击败关键的优化,例如,通过在每个可能的调用者的开始处设置一个exec '' --并因此看到系统的性能崩溃)。
除了分配给调用者的本地名称之外,exec thecode in thelocals, theglobals可能会做您想做的事情,并且inspect模块允许您以半合理的方式获取调用者的本地和全局变量(就深度黑魔法而言--这会让我对任何建议在生产代码中实现的同事大发雷霆--可能会受到不必要的称赞,称其为“半合理”,即;-)。
但是您需要指定“我希望能够执行任何代码”。这种明确规范的唯一解决方案(感谢您如此精确,因为它使回答变得更容易!)是:然后,使用不同的编程语言。
发布于 2010-09-26 01:17:14
第三方库是用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我想打补丁要比重写框架本地代码稍好一些。;)
https://stackoverflow.com/questions/3794461
复制相似问题