description for co_names
検査モジュールの読み取り:
ローカル変数の名前のタプル
ただし、実際にはco_names
はグローバル変数名のタプルであり、co_varnames
は、ローカル変数名(および引数名)のタプルです。例えば:
a = 1
def f(b):
c = a + b
print(f.__code__.co_varnames) # prints ('b', 'c')
print(f.__code__.co_names) # prints ('a',)
さらに、dis
モジュールのドキュメントでは、多くの命令の説明がco_names
には、グローバル変数の名前が含まれています。たとえば、LOAD_GLOBAL
description 読み取り:
Co_names [namei]という名前のグローバルをスタックにロードします。
ここで何か誤解していますか?しますco_names
には「ローカル変数の名前」が本当に含まれていますか?
コメント/回答で述べたように、これはドキュメントのエラーのようです。報告されたバグの問題 こちら 。
プル要求 承認され、マージされるのを待っているこのドキュメントのエラーを修正します。
他の人がすでに言っているように、これはドキュメントエラーのようです。 コードオブジェクトのドキュメント は ドキュメントのinspect
と明らかに矛盾します:
co_varnames
はaローカル変数の名前を含むタプル(引数名で始まる); [...]co_names
は、バイトコードによって使用される名前を含むタプルです;
また、コードオブジェクトの属性co_names
およびco_varnames
へのアクセスは、inspect
に記述された内容と競合します。
>>> def f():
... a = 1
... b = 2
...
>>> f.__code__.co_names
()
>>> f.__code__.co_varnames
('a', 'b')
さらに、ソースコードの CPythonのコンパイラ のコメントでは、co_varnames
がローカル変数用であることを明示的に述べています。
PyObject *u_names; /* all names */
PyObject *u_varnames; /* local variables */
co_varnames
が表示されない理由は、上記のコードがPythonがコンパイルに使用するコンパイラオブジェクトの属性を初期化しているためですコード u_names
とu_varnames
の両方が後でPyCode_New
に渡されます-CPythonコードオブジェクトのコンストラクタ:
names = dict_keys_inorder(c->u->u_names, 0);
varnames = dict_keys_inorder(c->u->u_varnames, 0);
...
co = PyCode_New(..., names, varnames, ... );
そして PyCode_New
はnames
およびvarnames
をco_names
およびco_varnames
属性にそれぞれ割り当てます :
Py_INCREF(names);
co->co_names = names;
Py_INCREF(varnames);
co->co_varnames = varnames;
まだ行っていない場合は、 bugs.python.org でバグレポートに記入して、Python開発チームにドキュメント内のこの不整合について知らせる必要があります。