- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 exec() 语句来设置一个值,如下所示:
foo = 3
def return_4():
return 4
instruction = 'foo = return_4()'
exec(instruction) # <---- WHERE THE MAGIC HAPPENS
print(foo)
如我所料,结果为 4。
我的程序有操作魔方的操作。在这个精简版中,我将做四件事:
我将实例化一个立方体,填充一个面(使用“前左上”和“右前下”等缩写)。
我将拥有一个旋转正面的功能。
我将有一个“解释器”函数,它接受一个多维数据集和一个指令列表,并将这些指令应用于多维数据集,返回修改后的多维数据集。这是我使用“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(instruction + '(return_cube)')
所以也许这只是学术上的。为什么玩具示例有效,而实际代码却失败了?(我是不是在做一些明显而愚蠢的事情,比如漏掉一个等号?我敢打赌,我会踢自己的……)
感谢任何人可以提供的帮助。
最佳答案
在 Python 2.x 上,exec
是一个将变量查找从 LOAD_GLOBAL
和 LOAD_FAST
更改为 LOAD_NAME
您在函数中访问的每个名称。这意味着它首先搜索本地范围,看看是否可以在检查全局范围后找到要命名的名称。
现在,在 Python 3.x 上,exec
函数无法更改此查找并且永远不会找到您定义的名称,除非您使用您希望对结果进行评估的范围。
exec(some_code, globals())
要使其正常工作,您需要在函数内添加 global my_var
以确保查找正常工作。
请记住,这些东西将被插入到您模块的全局命名空间中...
顺便说一句,为什么需要 exec
或 eval
?为什么不能向 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/
我是一名优秀的程序员,十分优秀!