1. はじめに
Pythonの学習を進めていると、「eval()関数」という強力な組み込み関数に出会うことがあります。本記事では、Python|eval()関数とは?使い方を解説というテーマで、初心者の方にもわかりやすく丁寧に解説していきます。
eval()
関数は、文字列として記述されたPython式を評価して実行する機能を持っています。柔軟な処理が可能になる反面、注意しないと危険な側面もあります。
この記事では、eval関数の基本的な使い方から応用例、注意点や安全に使うためのポイントまで、具体的なコード例とともに解説します。
2. Pythonのeval関数とは?基本の使い方
eval関数の概要と基本構文
eval()
関数は、文字列として与えられた式を「Pythonのコード」として評価・実行し、その結果を返します。構文は以下の通りです:
eval(expression[, globals[, locals]])
- expression:評価するPython式を文字列で指定
- globals:(任意)グローバル名前空間の辞書
- locals:(任意)ローカル名前空間の辞書
基本的な使用例
まずは、数式を文字列として評価してみましょう。
# 文字列の式を評価する
result = eval("3 + 5 * 2")
print(result)
実行結果:
13
このように、文字列内のPython式をそのまま実行し、結果を返します。
変数を使った評価
eval関数は変数を使った式にも対応しています。
x = 10
y = 3
result = eval("x * y + 2")
print(result)
実行結果:
32
式中の変数x
やy
は、実行時にスコープ内で解釈されます。
3. eval関数のよくある使い方・応用例
① 数式電卓として使う
ユーザーから入力された数式を評価して、簡易的な電卓として使うことができます。
expression = input("数式を入力してください:") # 例: 5 + 8 * 2
result = eval(expression)
print("計算結果:", result)
実行結果(例):
計算結果:21
このように、eval()
を使えば文字列のまま数式を処理することができます。
② JSONや辞書のような文字列の評価
辞書形式の文字列をeval()
で辞書に変換することも可能です。
data_str = "{'name': 'Alice', 'age': 25}"
data_dict = eval(data_str)
print(data_dict["name"])
実行結果:
Alice
ただし、eval()
より安全な方法としては、json.loads()
の使用が推奨されます(後述)。
③ globals・localsを使った制限評価
eval()関数の第2・第3引数を使うことで、評価環境を限定できます。
expr = "a + b"
scope = {"a": 5, "b": 10}
result = eval(expr, {}, scope)
print(result)
実行結果:
15
この方法を使うと、eval
がアクセスできる変数を限定し、セキュリティをある程度担保できます。
4. eval関数の注意点とエラー対策
① evalのセキュリティリスク
eval関数は極めて強力である一方、危険も伴います。例えば、ユーザーが次のような悪意のあるコードを入力した場合:
# 絶対にやってはいけない例
eval("__import__('os').remove('important_file.txt')")
このような入力が通ってしまうと、osモジュール
を使ってファイルを削除される可能性があります。
② evalの代替案:ast.literal_eval
安全性が求められる場合は、ast.literal_eval()
を使うのがベストです。これは文字列をリテラルとしてしか評価しないため、セキュリティリスクが低くなります。
import ast
safe_dict = ast.literal_eval("{'x': 1, 'y': 2}")
print(safe_dict["x"])
実行結果:
1
eval()
で「信頼できない入力」をそのまま評価するのは避けるべきです。
③ SyntaxErrorやNameErrorの対処
evalの中で文法エラーが起きるとSyntaxError
が、未定義の変数を使うとNameError
が発生します。try-except
で処理しましょう。
try:
result = eval("a + b")
except NameError:
print("変数が定義されていません")
except SyntaxError:
print("式の構文に誤りがあります")
実行結果(例):
変数が定義されていません
5. まとめ
今回はPythonのeval関数の使い方について、基礎から応用、そして注意点まで丁寧に解説しました。
eval()
は文字列として渡したPython式を評価・実行できる強力な関数- 数式計算や辞書の評価など、実務でも使える場面がある
- ただし、セキュリティリスクが非常に高いため、信頼できないデータには使用しない
ast.literal_eval()
など、安全な代替手段も検討しよう
eval関数は、正しく使えば柔軟なコード処理を可能にしますが、無防備に使うと危険です。実務で活用する際には、適切な制御や代替手段を意識しましょう。
学習のコツ: 安全に使える場面を想定して、実際に手を動かして試してみると理解が深まります。