gpt4 book ai didi

Python 3.2.1 : exec ('x = y()' ) sets a value in a toy example, 但不在完整代码中

转载 作者:行者123 更新时间:2023-11-28 20:27:27 33 4
gpt4 key购买 nike

我正在使用 exec() 语句来设置一个值,如下所示:

foo = 3
def return_4():
return 4
instruction = 'foo = return_4()'
exec(instruction) # <---- WHERE THE MAGIC HAPPENS
print(foo)

如我所料,结果为 4。

我的程序有操作魔方的操作。在这个精简版中,我将做四件事:

  1. 我将实例化一个立方体,填充一个面(使用“前左上”和“右前下”等缩写)。

  2. 我将拥有一个旋转正面的功能。

  3. 我将有一个“解释器”函数,它接受一个多维数据集和一个指令列表,并将这些指令应用于多维数据集,返回修改后的多维数据集。这是我使用“exec”的地方(也是我认为发生破损的地方)。

  4. 最后,我将在我的部分立方体上运行解释器,并指示将面旋转一次。

+

my_cube = [['FTL', 'FTM', 'FTR',
'FML', 'FMM', 'FMR',
'FBL', 'FBM', 'FBR'],
[],[],[],[],[]] # other faces specified in actual code

def rotate_front(cube):
front = cube[0]
new_front = [front[6],front[3],front[0],
front[7],front[4],front[1],
front[8],front[5],front[2]]
# ...
ret_cube = cube
ret_cube[0] = new_front
# pdb says we are returning a correctly rotated cube,
# and calling this directly returns the rotated cube
return ret_cube

def process_algorithm(cube=default_cube, algorithm=[]):
return_cube = cube
for instruction in algorithm:
exec('return_cube = ' + instruction + '(return_cube)') # <--- NO MAGIC!
# ACCORDING TO pdb, return_cube HAS NOT BEEN ROTATED!
return return_cube

process_algorithm(cube = my_cube, algorithm = ['rotate_front'])

如果我用 x = eval(y) 替换 exec(x = y) 格式,它似乎可以工作。 return_cube = eval(instruction + '(return_cube)')

所以也许这只是学术上的。为什么玩具示例有效,而实际代码却失败了?(我是不是在做一些明显而愚蠢的事情,比如漏掉一个等号?我敢打赌,我会踢自己的……)

感谢任何人可以提供的帮助。

最佳答案

在 Python 2.x 上,exec 是一个将变量查找从 LOAD_GLOBALLOAD_FAST 更改为 LOAD_NAME 您在函数中访问的每个名称。这意味着它首先搜索本地范围,看看是否可以在检查全局范围后找到要命名的名称。

现在,在 Python 3.x 上,exec 函数无法更改此查找并且永远不会找到您定义的名称,除非您使用您希望对结果进行评估的范围。

exec(some_code, globals())

要使其正常工作,您需要在函数内添加 global my_var 以确保查找正常工作。

请记住,这些东西将被插入到您模块的全局命名空间中...

顺便说一句,为什么需要 execeval?为什么不能向 algorithm 列表中添加真正的函数?


作为旁注,我可以看到您没有更改函数上的 algorithm var,但是如果您这样做会引入一些不良副作用,因为您创建的默认值是可变的并且将用于所有函数调用。

为了安全起见,将其更改为 None 并在需要时创建一个新列表。

关于Python 3.2.1 : exec ('x = y()' ) sets a value in a toy example, 但不在完整代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8696602/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com