Python のコンパイル処理で使われる compile() 関数について、基本的な使い方から実践的な例まで詳しく解説します。
compile() 関数とは
compile() 関数は、文字列やファイルの形で書かれたPythonコードをコンパイルして、実行可能なコードオブジェクトに変換する関数です。
基本的な構文は以下の通りです:
compile(source, filename, mode)- source: コンパイルする対象のコード(文字列またはAST)
- filename: コードのファイル名(通常は '
' を使用)
- mode: コンパイルモード('exec'、'eval'、'single'のいずれか)
主な使用例
1. 基本的な式のコンパイル
# 単純な計算式をコンパイル
code = compile('2 + 3', '<string>', 'eval')
result = eval(code)
print(result) # 出力: 52. 複数行のコードをコンパイル
source = '''
def greet(name):
return f"Hello, {name}!"
'''
code = compile(source, '<string>', 'exec')
exec(code)
print(greet("Alice")) # 出力: Hello, Alice!3. モードの違いによる使用例
# eval モード - 式の評価
eval_code = compile('x * y', '<string>', 'eval')
x, y = 10, 20
result = eval(eval_code)
print(result) # 出力: 200
# exec モード - 文の実行
exec_code = compile('x = 100', '<string>', 'exec')
exec(exec_code)
print(x) # 出力: 100
# single モード - 単一の文
single_code = compile('print("Hello")', '<string>', 'single')
exec(single_code) # 出力: Helloエラー処理
compile() 関数使用時に発生する可能性のある主なエラーと対処方法を紹介します:
1. SyntaxError
try:
compile('if x = 1:', '<string>', 'exec')
except SyntaxError as e:
print("構文エラー:", e)2. TypeError
try:
compile(123, '<string>', 'exec') # 数値は無効
except TypeError as e:
print("型エラー:", e)ベストプラクティス
1. セキュリティ考慮事項
# 信頼できないコードの実行は避ける
user_input = input("コードを入力: ")
if safe_to_execute(user_input): # セキュリティチェック関数
code = compile(user_input, '<string>', 'exec')
exec(code)2. エラーハンドリング
def safe_compile(source):
try:
return compile(source, '<string>', 'exec')
except (SyntaxError, ValueError) as e:
print(f"コンパイルエラー: {e}")
return None実践的な使用例
1. 動的な関数生成
def create_math_function(operation):
source = f'''
def calculate(x, y):
return x {operation} y
'''
code = compile(source, '<string>', 'exec')
namespace = {}
exec(code, namespace)
return namespace['calculate']
add = create_math_function('+')
print(add(5, 3)) # 出力: 82. 設定ファイルの読み込み
config_str = '''
DEBUG = True
MAX_CONNECTIONS = 100
SERVER_NAME = "MyServer"
'''
config = {}
compiled = compile(config_str, '<string>', 'exec')
exec(compiled, config)
print(config['DEBUG']) # 出力: Truecompile() 関数は、動的なコード生成やスクリプト実行など、高度なPythonプログラミングで重要な役割を果たします。ただし、セキュリティリスクを考慮し、信頼できるソースからのコードのみを実行するようにしましょう。