# Pythonの`eval()`および`exec()`関数: 動的なコード実行の可能性
Pythonには動的なコードの実行を可能にする2つの重要な関数があります。それがeval()およびexec()関数です。この記事では、これらの関数について詳しく説明し、具体的なコード例を交えてその使い方を解説します。
eval()関数
基本的な使い方
eval()関数は、Pythonの式を文字列として受け取り、その結果を返します。基本的な構文は以下の通りです。
eval(expression, globals=None, locals=None)
expression: 評価するPythonの式を表す文字列。globals: グローバルな名前空間を指定する辞書。デフォルトはNone。locals: ローカルな名前空間を指定する辞書。デフォルトはNone。
以下は基本的な例です。
result = eval('2 + 3') print(result) # 出力: 5
この例では、eval()関数を使って文字列 '2 + 3' を評価し、その結果を取得しています。
変数の値を利用する
eval()関数は、指定した文字列内で変数が参照されている場合、その変数の値を取得できます。
x = 5 y = 10 expression = 'x + y' result = eval(expression) print(result) # 出力: 15
この例では、xとyという変数が文字列 expression 内で参照され、eval()関数がそれらの変数の値を取得して計算しています。
グローバルおよびローカルな名前空間の利用
eval()関数はオプションとして、グローバルおよびローカルな名前空間を指定することができます。これにより、式内で参照される変数のスコープを調整できます。
x = 5 def evaluate_expression(): y = 10 expression = 'x + y' result = eval(expression, globals(), locals()) print(result) evaluate_expression() # 出力: 15
この例では、eval()関数に globals() および locals() を使用して、グローバルおよびローカルな名前空間を指定しています。
exec()関数
基本的な使い方
exec()関数は、Pythonの文を文字列として受け取り、その文を実行します。基本的な構文は以下の通りです。
exec(source, globals=None, locals=None)
source: 実行するPythonの文を表す文字列。globals: グローバルな名前空間を指定する辞書。デフォルトはNone。locals: ローカルな名前空間を指定する辞書。デフォルトはNone。
以下は基本的な例です。
exec('result = 2 + 3') print(result) # 出力: 5
この例では、exec()関数を使って文字列 'result = 2 + 3' を実行し、その結果として変数 result が生成されています。
変数の値を利用する
exec()関数も、eval()関数同様に変数の値を利用することができます。
x = 5 y = 10 source = 'result = x + y' exec(source) print(result) # 出力: 15
この例では、変数 x と y の値を利用して、result という変数を生成しています。
グローバルおよびローカルな名前空間の利用
exec()関数も、オプションとしてグローバルおよ
びローカルな名前空間を指定することができます。
x = 5 def execute_code(): y = 10 source = 'result = x + y' exec(source, globals(), locals()) print(result) execute_code() # 出力: 15
この例では、exec()関数に globals() および locals() を使用して、グローバルおよびローカルな名前空間を指定しています。
注意点
eval()およびexec()関数は慎重に使用する必要があります。不正なコードの実行やセキュリティ上の問題が発生する可能性があります。- 文字列として渡されたコードや式が信頼できるソースから来ていることを確認し、不正な入力を避けるようにしましょう。
まとめ
eval()およびexec()関数は、Pythonで動的なコードの実行を可能にする強力なツールです。これらを使用することで、文字列からコードを生成し、実行することができます。ただし、注意が必要であり、安全に使用するためには適切なセキュリティ対策が必要です。