Pythonコードオブジェクトとは?生成方法と主な属性を解説
Pythonコードオブジェクトとは
コードオブジェクト(code object)は、CPython実装における低レベルな内部構造の一つです。それぞれのコードオブジェクトは、まだ関数へと束縛されていない「実行可能なコードの断片」を表します。
コードオブジェクトは実行可能なコードを保持していますが、それ自体を直接呼び出すことはできません。実際に実行するには、組み込み関数 exec() を使用する必要があります。
コードオブジェクトは、組み込み関数 compile() を使って文字列から生成できます。compile(ソース, ファイル名, モード) の形式で呼び出し、モードには 'exec' を指定するのが一般的です。
以下の例では、与えられたコードからコードオブジェクトがどのように作成されるか、そしてそのコードオブジェクトに紐づくさまざまな属性を確認していきます。
サンプルコード
code_str = """
print("Hello Code Objects")
"""
# コードオブジェクトを作成
code_obj = compile(code_str, '<string>', 'exec')
# コードオブジェクトを表示
print(code_obj)
# コードオブジェクトの属性一覧
print(dir(code_obj))
# ファイル名
print(code_obj.co_filename)
# 最初の生バイトコード
print(code_obj.co_code)
# 変数名
print(code_obj.co_varnames)実行結果
上記のコードを実行すると、次のような結果が出力されます。
<code object <module> at 0x000001D80557EF50, file "<string>", line 2> ['__class__', '__delattr__', '__dir__', '__doc__', ……, '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', ……, 'posonlyargcount', 'co_stacksize', 'co_varnames', 'replace'] <string> b'e\x00d\x00\x83\x01\x01\x00d\x01S\x00' ()
主な属性の解説
コードオブジェクトには多数の属性がありますが、特によく参照されるものを以下にまとめます。
- co_filename:コードがコンパイルされた元のファイル名。上記の例では
<string>となっています。 - co_code:コンパイル済みの生バイトコード(bytes型)。CPythonの仮想マシンが実際に実行する命令列です。
- co_varnames:ローカル変数名のタプル。モジュールレベルのコードでは空のタプル
()になります。 - co_consts:コード中で使用される定数(リテラルなど)のタプル。
- co_argcount:関数が受け取る引数の数。
このように、コードオブジェクトの中身を調べることで、Pythonがソースコードをどのようにバイトコードへ変換しているかを理解できます。標準ライブラリの dis モジュールと組み合わせて逆アセンブルしたり、メタプログラミングや高度なデバッグに活用したりすることも可能です。
-
Pythonのファイルオブジェクトとは?open関数によるファイル操作の基本を徹底解説
Pythonでは、ファイルを読み書きする際に特別なライブラリをインポートする必要はありません。ファイル操作は言語にネイティブに組み込まれているためです。 まず最初に行うのは、組み込み関数 open() を使ってファイルオブジェクトを取得することです。open() 関数はファイルを開き、ファイルオブジェクトを返します。このファイルオブジェクトには、開いたファイルから情報を取得したり、内容を操作したりするためのメソッドや属性が含まれています。 ファイルとは何か? ファイル操作を行う前に、「ファイルとは何か」を理解しておきましょう。ファイルとは、関連する情報を保存するためにディスク上に確保された「名
-
Pythonオブジェクトのソースコードを取得する方法(inspect.getsourceの使い方)
Pythonでは、標準ライブラリのinspectモジュールに含まれるgetsource()メソッドを使うことで、関数やクラスなどのオブジェクトのソースコードを簡単に取得できます。inspect.getsource(object)getsource()メソッドの概要inspect.getsource()は、指定したオブジェクトのソースコードのテキストを返します。引数には以下のようなオブジェクトを指定できます。モジュールクラスメソッド関数トレースバック(traceback)フレーム(frame)コードオブジェクトソースコードは単一の文字列として返されます。なお、ソースコードを取得できない場合にはO