代码对象
********

代码对象是 CPython 实现的低层级细节。 每个代表一块尚未绑定到函数中的可
执行代码。

type PyCodeObject

   用于描述代码对象的对象的 C 结构。 此类型字段可随时更改。

PyTypeObject PyCode_Type

   这一个代表 Python 代码对象 的 "PyTypeObject" 实例。

int PyCode_Check(PyObject *co)

   如果 *co* 是一个 代码对象 则返回真值。 此函数总是会成功执行。

int PyCode_GetNumFree(PyCodeObject *co)

   返回 *co* 中的自由变量数。

PyCodeObject *PyCode_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)
    *返回值：新的引用。*

   返回一个新的代码对象。 如果你需要用一个空白代码对象来创建帧，请改用
   "PyCode_NewEmpty()"。 直接调用 "PyCode_New()" 将会绑定一个具体
   Python 版本，因为字节码经常会变动。 此函数的各种参数存在复杂的相互
   依赖，这意味着对值的细微改变可能会导致不正确的执行或 VM 的崩溃。 必
   须非常小心地使用这个函数。

   在 3.11 版本发生变更: 添加了 "qualname" 和 "exceptiontable" 形参。

PyCodeObject *PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)
    *返回值：新的引用。*

   与 "PyCode_New()" 类似，但还有一个针对仅限位置参数的额外的
   "posonlyargcount"。 适用于 "PyCode_New" 的注意事项同样适用于这个函
   数。

   在 3.8 版本加入.

   在 3.11 版本发生变更: 增加了 "qualname" 和  "exceptiontable" 形参。

PyCodeObject *PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
    *返回值：新的引用。*

   返回一个具有指定用户名、函数名和首行行号的空代码对象。 结果代码对象
   如果被执行则将引发一个 "Exception"。

int PyCode_Addr2Line(PyCodeObject *co, int byte_offset)

   返回在 "byte_offset" 位置或之前以及之后发生的指令的行号。 如果你只
   需要一个帧的行号，请改用 "PyFrame_GetLineNumber()"。

   要高效地对代码对象中的行号进行迭代，请使用 在 PEP 626 中描述的 API
   。

int PyCode_Addr2Location(PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column)

   将传入的 "int" 指针设为 "byte_offset" 处的指令的源代码行编号和列编
   号。 当没有任何特定元素的信息时则将值设为 "0"。

   如果函数执行成功则返回 "1" 否则返回 0。

   在 3.11 版本加入.

PyObject *PyCode_GetCode(PyCodeObject *co)

   等价于 Python 代码 "getattr(co, 'co_code')"。 返回一个指向表示代码
   对象中的字节码的 "PyBytesObject" 的强引用。 当出错时，将返回 "NULL"
   并引发一个异常。

   这个 "PyBytesObject" 可以由解释器按需创建并且不必代表 CPython 所实
   际执行的字节码。 此函数的主要用途是调试器和性能分析工具。

   在 3.11 版本加入.

PyObject *PyCode_GetVarnames(PyCodeObject *co)

   等价于 Python 代码 "getattr(co, 'co_varnames')"。 返回一个指向包含
   局部变量名称的 "PyTupleObject" 的新引用。 当出错时，将返回 "NULL"
   并引发一个异常。

   在 3.11 版本加入.

PyObject *PyCode_GetCellvars(PyCodeObject *co)

   等价于 Python 代码 "getattr(co, 'co_cellvars')"。 返回一个包含被嵌
   套的函数所引用的局部变量名称的 "PyTupleObject" 的新引用。 当出错时
   ，将返回 "NULL" 并引发一个异常。

   在 3.11 版本加入.

PyObject *PyCode_GetFreevars(PyCodeObject *co)

   等价于 Python 代码 "getattr(co, 'co_freevars')"。 返回一个指向包含
   自由变量名称的 "PyTupleObject" 的新引用。 当出错时，将返回 "NULL"
   并引发一个异常。

   在 3.11 版本加入.
