【问题标题】:How to specify another scope for the exec statement如何为 exec 语句指定另一个范围
【发布时间】:2013-01-10 23:33:45
【问题描述】:

我正在跟踪一个名为 tracedFn() 的函数:

sys.settrace(traceit)
tracedFn()
sys.settrace(None)

tracedFn:

def tracedFn():
    foo = False

traceit 函数中,我想使用 exec 语句来执行带有 tracedFn() 中变量的语句,如下所示:

def traceit(frame, event, trace_arg):
    if event == 'line':
        exec 'foo = True'
        print frame.f_locals
        #foo still False

return traceit

但是当我打印 frame.f_locals 时,exec 不会更改 foo 变量?

【问题讨论】:

    标签: python


    【解决方案1】:

    exec statement documentation;您可以通过在表达式后添加in 来指定上下文:

    exec 'foo = True' in frame.f_globals, frame.f_locals
    

    请注意,您不能向函数添加新的局部变量。您只能更改现有的局部变量(那些在编译时已在函数中声明的变量)。因此,除非foo 已在您正在跟踪的函数中定义,否则您不能添加 foo 到该函数的局部变量中。

    全局变量不受这种限制;您可以随意添加到全局命名空间;在这种情况下,只需省略 , frame.f_locals 部分即可。

    【讨论】:

    • @fulman:定义“不起作用”。你有没有先尝试过更简单的,比如frame.f_locals['foo'] = True
    • @Martijin Pieters 我的意思是本地人没有被 exec 语句更新。即使我使用 'frame.f_locals['foo'] = True' 然后打印 frame.f_locals foo 变量保持不变!
    • @fulman:那么settrace() 函数不会你添加到该函数的局部变量中。看,但不要碰!您只能更改现有的本地人。
    • @Martijin Pieters exec 在当前范围内工作正常。我的意思是所有 traceit 函数的本地人。
    • @fulman:是的,我知道你的意思。但是您只能更改现有的函数局部变量,而不能添加新的局部变量。
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2019-09-13
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多