Python|eval()関数とは?使い方を解説

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

式中の変数xyは、実行時にスコープ内で解釈されます。

 

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関数は、正しく使えば柔軟なコード処理を可能にしますが、無防備に使うと危険です。実務で活用する際には、適切な制御や代替手段を意識しましょう。

学習のコツ: 安全に使える場面を想定して、実際に手を動かして試してみると理解が深まります。

タイトルとURLをコピーしました