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で動的なコードの実行を可能にする強力なツールです。これらを使用することで、文字列からコードを生成し、実行することができます。ただし、注意が必要であり、安全に使用するためには適切なセキュリティ対策が必要です。