我正在使用 exec() 语句来设置一个值,如下所示:
foo = 3
def return_4():
return 4
instruction = 'foo = return_4()'
exec(instruction) # <---- WHERE THE MAGIC HAPPENS
print(foo)
正如我所料,结果为 4。
我的程序有操作魔方的操作。在这个精简版中,我将做四件事:
我将实例化一个立方体,填充一个面(带有“front top left”和“front bottom right”等的缩写)。
我将有一个旋转正面的功能。
我将有一个“解释器”函数,它接受一个多维数据集和一个指令列表,并将这些指令应用于多维数据集,返回修改后的多维数据集。这是我使用'exec'的地方(以及我认为破损发生的地方)。
最后,我将在我的部分立方体上运行解释器,并指示旋转一次面。
+
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(指令 + '(return_cube)')
所以也许这只是学术性的。为什么玩具示例有效,而实际代码失败?(我是不是在做一些明显而愚蠢的事情,比如错过一个等号?我要踢自己,我敢打赌......)
感谢任何人都可以提供的任何帮助。