Python exec() ビルトイン関数
この関数は、Python コードの動的実行をサポートします。object は文字列またはコードオブジェクトのいずれかでなければなりません。文字列の場合、その文字列は Python ステートメントのスイートとして解析され、その後実行されます(構文エラーが発生しない限り)[...].
Introduction
Python の exec() 関数は、文字列に格納されている Python コードを動的に実行できるようにするビルトイン関数です。これは、ユーザーから提供されたコードを実行したい場合、実行時にコードを生成して実行したい場合、あるいはアプリケーション内にミニインタープリタやスクリプト環境を構築したい場合など、非常に強力です。ただし、適切に処理されない場合、セキュリティリスクを引き起こす可能性があるため、注意して使用する必要があります。
Syntax
exec(object[, globals[, locals]])
object: 実行する Python コードを含む文字列。globals(オプション): グローバル名前空間を表す辞書。指定しない場合、現在のグローバル名前空間を使用します。locals(オプション): ローカル名前空間を表す辞書。指定しない場合、現在のローカル名前空間を使用します。
Basic Usage
code_to_execute = "print('Hello, exec()!')"
exec(code_to_execute)
Hello, exec()!
exec() 関数は、print() 関数と組み合わせて、コンソールに出力を表示するためにも使用できます。
Executing Multiple Statements
code = """
for i in range(5):
print(i)
"""
exec(code)
0
1
2
3
4
この例では、exec() 関数を使用して for ループを実行し、range の数値を反復処理して、各数値をコンソールに出力します。
Modifying Variables
x = 10
code = "x += 5"
exec(code)
print(x)
15
Using globals and locals
x = 5
code = "x = x * 2"
globals_dict = {"x": 10}
locals_dict = {"x": 20}
exec(code, globals_dict, locals_dict)
print(x)
print(globals_dict)
print(locals_dict)
5
{'x': 10}
{'x': 40}
Dynamic Function Creation
def create_dynamic_function(name, args):
code = f"def {name}({', '.join(args)}): return sum({args})"
exec(code)
create_dynamic_function("add_numbers", ["a", "b", "c"])
result = add_numbers(2, 3, 5)
print(result)
10
この例では、exec() 関数を使用して動的関数を作成し、引数のリストを受け取り、それらの合計を返します。
Error Handling
code = """
try:
print(undefined_variable)
except NameError as e:
print(f"Error: {e}")
"""
exec(code)
Error: name 'undefined_variable' is not defined
Security Note
user_input = input("Enter code to execute: ")
exec(user_input) # Caution: This can be a security risk if not properly sanitized.