Pythonのcompile関数を使って動的にコードを生成する方法

スポンサーリンク

今回は、Pythonのcompile()関数に注目します。

スポンサーリンク

Pythonのcompile()関数の動作を理解します。

ここで、マクロと関数の概念を扱ったシステム/OSプログラミングに話を戻しましょう。

マクロは基本的にあらかじめ定義されたコードブロックであり、関数呼び出し時に現在のソースコードと一緒に実行されます。

つまり、関数ブロック全体が、作業中のプログラムコード内で一発で実行されます。

同じように、Pythonのcompile()関数は、関数内でコードの断片を定義するのに役立ちます。

さらに、定義されたコードをプログラム内の任意の場所で実行するために使用できるコードブロックオブジェクトが生成されます。

compile()関数内で定義された入力-ソース-コードは、関数から返されるコードオブジェクトを通して、どんなプログラムでも簡単に実行することができます

このように、Pythonのcompile()関数は、再利用性の達成に役立ち、より信頼性が高いことが証明されています。

Python compile() 関数のシンタックス

Python compile() 関数は、ソースコードを引数として受け取り、実行可能なコードオブジェクトを返します。

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

ここで、Pythonのcompile()関数のパラメータリストを詳しく理解しましょう。

compile()関数のパラメータ

  • source(必須)。ソースコードまたはコンパイルするバイト列です。
  • filename (必須): ソースコードを格納するファイル名です。存在しない場合は、ソースコードの名前を入力することができる。
  • mode (必須): ソースをコンパイルするときのモードです。この3つのモードは以下の通りです。
  • eval: 1. eval: ソースが1つの式でコンパイルされるモードです。
    2.シングル。ソースが単一の対話型文である場合に使用される。
  • exec: ソースが実行するステートメントのブロックを含む場合に使用されます。

オプションのパラメータです。

  • flags: デフォルト値は 0 です。
  • dont_inherit: 実行のフローを決定します。デフォルト値は False です。
  • Optimize: デフォルト値は-1です。

Python compile() 関数の例

以下の例では、compile()関数にソースコードとして1つの変数’var = 10’を渡しています。

さらに、引数リストに渡されたソースをコンパイルして実行するために「シングルモード」を使用しています。

var = 10
compile_obj = compile('var', 'Value', 'single')
exec(compile_obj)

compile()関数により、渡されたソースコードに対応するコードオブジェクトが生成されます。

次に、Pythonのexec()関数を使用して、コードオブジェクトを動的にコンパイルします。

結果は以下の通りです。

 

ここでは、compile()関数に一つの実行式を渡しているので、「evalモード」が使用されています。

action = 'print(100)'
compile_obj = compile(action, 'Display', 'eval')
 
exec(compile_obj)

結果は以下の通りです。

100

下図のように、compile()関数にソースコードの文字列を渡し、exec()関数で作成したコードオブジェクトを通してコードブロックを実行するために’execモード’を使用しています。

action = 'x = 15
y =10
product=x*y
print("Product of x and y =",product)'
compile_obj = compile(action, 'Product', 'exec')
 
exec(compile_obj)

結果は以下の通りです。

Product of x and y = 150

まとめ

ここまでで、このトピックは終了です。

何か疑問があれば、お気軽にコメントください。

Pythonプログラミングに関連する他の記事については、Python Tutorials Pythonをご覧ください。

タイトルとURLをコピーしました