Pythonで組み込み関数eval, execを使ってコードを動的に実行
この記事では、Pythonの組み込み関数であるeval()とexec()を使用して、コードを動的に実行する方法について説明します。安全な使用方法とリスクについても解説します。
目次
eval()関数による式の評価
eval()関数は、文字列で表されたPythonの式を評価し、その結果を返します。
expression = "2 + 2"
result = eval(expression)
print(result) # 出力: 4
単純な算術式だけでなく、より複雑な式も評価できます。ただし、ユーザーからの入力などを直接eval()に渡すのは危険です。
expression = "[1, 2, 3] + [4, 5, 6]"
result = eval(expression)
print(result) # 出力: [1, 2, 3, 4, 5, 6]
変数も使用できます。
x = 10
expression = "x * 2"
result = eval(expression)
print(result) #出力 20
exec()関数による複数行コードの実行
exec()関数は、文字列で表された複数のPython文を実行します。
code = """
x = 10
y = 20
print(x + y)"""
exec(code)
#出力 30
複数の文を記述でき、変数への代入なども可能です。これもユーザーからの入力などを直接exec()に渡すのは非常に危険です。
code = """
def my_function(a, b):
return a * b
result = my_function(5, 3)
print(result) #出力 15 """
exec(code)
安全な使用方法と注意点
eval()とexec()は強力な関数ですが、セキュリティ上のリスクがあります。信頼できないソースからの入力データは絶対に渡さないでください。
- ユーザー入力は、事前に厳格な検証とサニタイズを行う必要があります。
- eval()とexec()は、可能な限り避けるべきです。代替手段がある場合は、それらを使用することを検討してください。
- サンドボックス環境で使用するなど、安全な実行環境を構築することが重要です。
eval()とexec()の使用例
eval()とexec()は、動的なコード生成や設定ファイルの読み込みなど、特定の状況で使用することができます。しかし、それらの使用には、常にセキュリティ上のリスクを考慮する必要があります。
import ast
# より安全な方法として、astモジュールを使用する方法があります。
code = "x + 1"
tree = ast.parse(code, mode='eval')
# treeが安全かどうか検証
compiled_code = compile(tree, '<string>', 'eval')
result = eval(compiled_code)
print(result)
まとめ
eval()とexec()は、コードを動的に実行するための便利な関数ですが、セキュリティ上のリスクを十分に理解した上で使用することが重要です。可能な限り、より安全な代替手段を検討してください。