次のように、値を設定するために exec() ステートメントを使用しています。
foo = 3
def return_4():
return 4
instruction = 'foo = return_4()'
exec(instruction) # <---- WHERE THE MAGIC HAPPENS
print(foo)
予想どおり、これは 4 になります。
私のプログラムには、ルービック キューブを操作する操作があります。この簡素化されたバージョンでは、次の 4 つのことを行います。
立方体をインスタンス化して、1 つの面を埋めます (「正面左上」と「正面右下」などの略語を使用)。
その正面を回転させる関数を用意します。
キューブと命令のリストを受け取り、それらの命令をキューブに適用して、変更されたキューブを返す「インタープリター」関数を用意します。これが私が「exec」を使用する場所です(そして、破損が発生すると思われる場所です)。
最後に、面を 1 回回転させる命令を使用して、部分的な立方体でインタープリターを実行します。
+
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)')
だから多分これは単なる学術的なものです。おもちゃの例は機能するのに、実際のコードは失敗するのはなぜですか? (イコール記号を忘れるなど、明白でばかげたことをしていますか? 私は自分自身を蹴るつもりです、きっと...)
誰でも提供できるヘルプをありがとう。