首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python2.5有没有等同于Tcl的uplevel命令?

Python2.5有没有等同于Tcl的uplevel命令?
EN

Stack Overflow用户
提问于 2010-09-25 23:54:48
回答 2查看 1.2K关注 0票数 3

python有没有等同于Tcl的uplevel命令?对于那些不知道的人来说,"uplevel“命令允许您在调用者的上下文中运行代码。下面是它在python中的样子:

代码语言:javascript
复制
def foo():
    answer = 0
    print "answer is", answer # should print 0
    bar()
    print "answer is", answer # should print 42


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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-26 01:03:28

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

除了分配给调用者的本地名称之外,exec thecode in thelocals, theglobals可能会做您想做的事情,并且inspect模块允许您以半合理的方式获取调用者的本地和全局变量(就深度黑魔法而言--这会让我对任何建议在生产代码中实现的同事大发雷霆--可能会受到不必要的称赞,称其为“半合理”,即;-)。

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

票数 3
EN

Stack Overflow用户

发布于 2010-09-26 01:17:14

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

代码语言:javascript
复制
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

我想打补丁要比重写框架本地代码稍好一些。;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3794461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档