在函数与模块作用域中,AST执行产生不同的结果

假面

编辑:问题与ast模块无关

只需使用exec以下命令即可复制它

y = None

exec("y = 5.0")
print(y)  # prints 5.0

def foo():
    y = None

    exec("y = 5.0")
    print(y)

foo()  # prints None

原始问题:

我正在使用ast模块以编程方式生成代码我有以下代码,可以正常工作:

import ast

num = ast.Num(n=5.)
y = None
assign = ast.Assign(targets=[ast.Name(id='y', ctx=ast.Store())], value=num)
tree = ast.Module(body=[assign], type_ignores=[])
ast.fix_missing_locations(tree)
c = compile(tree, filename="", mode="exec")
exec(c)  # replaces the value of 'y' with 5.0

print(y) # prints 5.0

但是,只要将此代码包装到函数中,它就会停止工作:

import ast

def foo():
    num = ast.Num(n=5.)

    y = None
    assign = ast.Assign(targets=[ast.Name(id='y', ctx=ast.Store())], value=num)
    tree = ast.Module(body=[assign], type_ignores=[])
    ast.fix_missing_locations(tree)
    c = compile(tree, filename="", mode="exec")
    exec(c)

    print(y)

foo()  # prints None

这是我第一次看到在函数内部移动后python代码的行为有所不同。我已经检查过,分配也没有放在y模块(本地)中:

print(y) # NameError: name 'y' is not defined

淀川味男

在函数中时,可以将分配捕获到任何字典中,这些字典将作为已执行语句的作用域:

def foo():
    scope = {}
    exec("y = 5.0", scope)
    print(scope['y'])

foo()  # prints 5.0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

logrotate执行的脚本与手动执行产生的结果不同

执行符号链接所产生的结果与执行它所指向的文件所产生的结果不同

手动执行块会产生不同的结果

使用相同的“for”循环和“all()”函数会产生不同的结果

在MATLAB中使用均值函数会产生不同的结果

罗马到整数相同的函数产生不同的结果

> 和 &> 产生不同的结果

aesEncrypt产生不同的结果

来自nltk模块的类似方法在不同的机器上产生不同的结果。为什么?

函数未在作用域中声明

Java8流的顺序执行和并行执行产生不同的结果?

在不同虚拟机上执行lgdt之后,引导加载程序会产生不同的结果

pthread执行产生奇怪的结果

相同顺序的类名产生不同的结果(Chrome、Webpack 3、CSS 模块)

散列相同的字符串在内核模块中产生不同的结果

javascript 乘法产生不同的结果

从收藏的Python deque的不确定性与秩序; 重复执行产生不同的结果

执行 [ FILE1 -ot FILE2 ] 在 make 和 shell 中产生不同的结果

通过SQL Server代理执行Select语句会产生不同的结果

单步执行会产生不同的结果,然后再运行

为什么添加浮点数会根据其执行方式产生不同的结果

sp_executesql与手动执行会产生不同的结果

为什么 %date% 在作为计划任务执行的批处理文件中产生不同的结果?

隐式和显式正则表达式的创建会产生不同的执行结果

在Python中访问模块/模块作用域中的变量

作用域中的ROR Access模块功能集成到模块中

随机函数产生重复结果

过程函数产生的相反结果

嵌套块作用域中的函数声明