LoginSignup
2
1

More than 5 years have passed since last update.

Pythonで関数のco_varnames, co_names, co_constsを確認する

Posted at

概要

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)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1