Я использую выражение 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'])
Если заменить замену exec (x = y) на x = eval (y), похоже, это сработает.return_cube = eval (инструкция + '(return_cube)')
Так что, возможно, это просто академический.Почему пример с игрушкой работает, а реальный код не работает?(Я делаю что-то очевидное и глупое, например, пропустить знак равенства? Я собираюсь надрать себя, держу пари ...)
Спасибо за любую помощь, которую кто-либо может предложить.