概要
Pythonの内部動作を学ぶため、関数のco_varnames, co_names, co_constsを確認する。
型 | 属性 | 説明 |
---|---|---|
コード | co_varnames | 引数名とローカル変数名のタプル |
co_names | ローカル変数名のタプル | |
co_consts | バイトコード中で使用している定数のタプル |
(以上、[1]より抜粋。)
目的
- Python3の内部動作を学ぶ準備として、関数がどのように変数・定数を保持しているか確認する。
環境
os: maxOS Sierra Version 10.12.6
python: Python 3.6.0
内容
f.__code__
に、関数f
をコンパイルしたバイトコード (bytecode) を格納するコードオブジェクトが割り当てられている。
インタープリタ
>>> def f(a, b):
... c = len(a)
... d = list(range(3))
... a + b
...
>>> for attr in ('co_varnames', 'co_names', 'co_consts'):
... print('{0}:\t{1}'.format(attr, getattr(f.__code__, attr)))
...
co_varnames: ('a', 'b', 'c', 'd')
co_names: ('len', 'list', 'range')
co_consts: (None, 3)
自分で定義した関数f
について、
- 引数名とローカル変数名のタプル
co_varnames
は、('a', 'b', 'c', 'd') - ローカル変数名のタプル
co_names
は、('len', 'list', 'range') - バイトコード中で使用している定数のタプル
co_consts
は、(None, 3)
であることがわかった。
疑問
co_names
は、本当にローカル変数名のタプルなのだろうか?
グローバルでなくて?
参考文献
[1] 29.12. inspect — 活動中のオブジェクトの情報を取得する (https://docs.python.jp/3/library/inspect.html)