Python で関数を動的に生成する(exec, eval)
exec や eval を使うと、文字列からコードを実行したり、関数を動的に生成したりできます。強力な機能ですが、セキュリティには注意が必要です。
eval:式を評価する
eval は文字列を式として評価し、結果を返します。
result = eval("2 + 3 * 4")
print(result) # 14
x = 10
result = eval("x * 2")
print(result) # 20
exec:文を実行する
exec は文字列をコードとして実行します。値を返しません。
code = """
def greet(name):
return f"Hello, {name}!"
"""
exec(code)
print(greet("Alice")) # Hello, Alice!
関数を動的に生成する
実行時に関数を作成できます。
def make_power_function(n):
code = f"""
def power(x):
return x ** {n}
"""
namespace = {}
exec(code, namespace)
return namespace["power"]
square = make_power_function(2)
cube = make_power_function(3)
print(square(5)) # 25
print(cube(5)) # 125
名前空間の制御
exec と eval は名前空間を指定できます。
namespace = {"x": 10, "y": 20}
result = eval("x + y", namespace)
print(result) # 30
セキュリティ上の注意
動的なコード生成はメタプログラミングやコード生成ツールで有用ですが、悪意あるコードが実行される可能性を常に意識してください。