Python exec() ビルトイン関数

Python 3 ドキュメントより

この関数は、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.