代码之家  ›  专栏  ›  技术社区  ›  Bryan Oakley

python 2.5是否有与tcl的uplevel命令等效的命令?

  •  2
  • Bryan Oakley  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  3
  •   Alex Martelli    14 年前

    一般来说,你所要求的是不可能的(毫无疑问,结果是你所期望的)。例如,假设“任何代码”是 x = 23 . 这会添加一个新变量吗 x 假设您确实找到了一种黑色的神奇的方法来“在调用者中”执行这段代码,那么您的调用者的局部变量集呢?不,不会的-- 这个 python编译器执行的关键优化是一次性定义 def 执行一组精确的局部变量(在函数体中被分配或绑定的所有裸名称),并将对这些裸名称的每个访问和设置转换为非常快速的stackframe索引。(你 能够 系统地击败关键优化,例如 exec '' 在每一个可能的调用者开始的时候——然后看到系统的性能崩溃)。

    除了 用于分配给呼叫者的本地裸名, exec thecode in thelocals, theglobals 可以做你想做的事情, inspect 模块可以让你以一种半合理的方式获得来电者的本地人和全球人(就深黑色魔法而言,这将使我去邮寄任何同事建议它是在生产代码中实施的),可以得到不恰当的赞扬称之为“半合理”,即我s;;

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

        2
  •  1
  •   Michał Kwiatkowski    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
    

    我想猴子修补比重写帧本地要好得多。;)

    推荐文章