はじめに
Pythonには、文字列をコードとして実行できる便利な関数「eval」があります。適切に使えば柔軟なプログラムを作成できますが、不適切な使用はセキュリティリスクを伴うため注意が必要です。本記事では、Python 3.11におけるeval関数の基本から応用まで詳しく解説します。
eval関数とは?
eval関数は、文字列として与えられたPythonの式を評価(実行)し、その結果を返す組み込み関数です。例えば、動的に数式を計算したり、変数を動的に変更する場合に利用されます。
eval関数の基本構文
以下の構文でeval関数を使用できます。
eval(expression[, globals[, locals]])
expression
:評価するPythonの式(文字列)globals
(オプション):グローバル変数の辞書locals
(オプション):ローカル変数の辞書
eval関数の使用例
数式の評価
expression = "2 + 3 * 4"
result = eval(expression)
print(result) # 出力: 14
変数を用いた評価
x = 10
y = 5
expression = "x * y"
result = eval(expression)
print(result) # 出力: 50
eval関数の応用例
辞書を用いた安全な評価
allowed_vars = {"a": 10, "b": 20}
expression = "a + b"
result = eval(expression, {"__builtins__": None}, allowed_vars)
print(result) # 出力: 30
ユーザー入力を安全に評価
import ast
def safe_eval(expression):
try:
node = ast.parse(expression, mode='eval')
if not all(isinstance(n, (ast.Expression, ast.BinOp, ast.Num, ast.Name)) for n in ast.walk(node)):
raise ValueError("不正な式が含まれています")
return eval(expression, {"__builtins__": None}, {})
except Exception as e:
return f"エラー: {e}"
expression = "5 + 10"
print(safe_eval(expression)) # 出力: 15
まとめ
eval関数は便利ですが、不適切な使用はセキュリティリスクを招きます。安全な使い方として、globals
や locals
を制限したり、ast
モジュールを活用することで、リスクを軽減できます。適切な場面でevalを活用し、より柔軟なPythonプログラムを作成しましょう。