代码之家  ›  专栏  ›  技术社区  ›  Alex

什么是co_名称?

  •  30
  • Alex  · 技术社区  · 7 年前

    这个 description 对于 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_名称 LOAD_GLOBAL description 内容如下:

    将全局命名的co_名称[namei]加载到堆栈中。

    我是不是误解了什么?做

    2017年7月17日编辑

    如评论/回答中所述,这似乎是一个文档错误。已存档错误问题 here

    2017年7月22日编辑

    Pull request

    2022年6月6日编辑

    Pull请求

    1 回复  |  直到 2 年前
        1
  •  26
  •   Chris    7 年前

    正如其他人已经说过的,这似乎是 这个 documentation for code objects documentation for inspect :

    co_varnames co_names 是一个 包含字节码使用的名称的元组 ;

    co_名称 co_varnames公司 的代码对象与 检查 :

    >>> def f():
    ...     a = 1
    ...     b = 2
    ... 
    >>> f.__code__.co_names
    ()
    >>> f.__code__.co_varnames
    ('a', 'b')
    

    CPython's compiler 明确提及

    PyObject *u_names;     /* all names */
    PyObject *u_varnames; /* local variables */
    

    你看不到的原因 co_varnames公司 编译器对象 u_names and u_varnames are both later passed into 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 assigns names and varnames to the co_names and co_varnames attributes respectively :

    Py_INCREF(names);
    co->co_names = names;
    Py_INCREF(varnames);
    co->co_varnames = varnames;
    

    如果您还没有,我建议您在 bugs.python.org 让Python开发团队了解文档中的这种不一致性。