Python 代码对象如何在 C 级别编组?
How is a Python code object marshalled at the C level?
Ned Batchelder back in 12008 的 post 声称 Python 代码对象在 Python 字节码文件中编组:
[...] The entire rest of the file is just the output of marshal.dump()
of the code object that results from compiling the source file.
这可能适用于在 Python 级别创建的代码对象,但这些代码对象究竟是如何在 C 级别编组的?
我查看了 Python code objects(version 3.5) 的文档,关于它们的说明不多,当然也没有提供有关它们如何编组的信息:
The C structure of the objects used to describe code objects. The fields of this type are subject to change at any time.
我也试过查看 Python code object's source code,但找不到任何能回答我问题的内容。
如果 Python 代码对象是在 C 级别使用结构实现的 - 我相信它们是 - 那么如何将它们编组到字节码文件中?就我所做的研究而言,C 既没有提供用于编组的内置方法,也没有提供任何第三方库?
如果代码对象在 C 级别编组,具体是如何完成的?如果不是,它们是如何编码成字节码的?
1我特别记下了日期,因为这个细节可能在 Python 版本之间发生了变化 。
This may apply to code objects created at the Python level, but how exactly are these code objects marshalled at the C level?
使用 marshal.dump
,或者可能是 marshal.dumps
.
等相关接口之一
不像"delegate to some C standard library function"那么简单;编组和解组实现包含一个 1820-line file 如果您想查看每个细节,您必须阅读。由于其数据结构和功能 Python 的具体性,大部分对象树遍历和序列化都需要从头开始编写。
Ned Batchelder back in 12008 的 post 声称 Python 代码对象在 Python 字节码文件中编组:
[...] The entire rest of the file is just the output of
marshal.dump()
of the code object that results from compiling the source file.
这可能适用于在 Python 级别创建的代码对象,但这些代码对象究竟是如何在 C 级别编组的?
我查看了 Python code objects(version 3.5) 的文档,关于它们的说明不多,当然也没有提供有关它们如何编组的信息:
The C structure of the objects used to describe code objects. The fields of this type are subject to change at any time.
我也试过查看 Python code object's source code,但找不到任何能回答我问题的内容。
如果 Python 代码对象是在 C 级别使用结构实现的 - 我相信它们是 - 那么如何将它们编组到字节码文件中?就我所做的研究而言,C 既没有提供用于编组的内置方法,也没有提供任何第三方库?
如果代码对象在 C 级别编组,具体是如何完成的?如果不是,它们是如何编码成字节码的?
1我特别记下了日期,因为这个细节可能在 Python 版本之间发生了变化 。
This may apply to code objects created at the Python level, but how exactly are these code objects marshalled at the C level?
使用 marshal.dump
,或者可能是 marshal.dumps
.
不像"delegate to some C standard library function"那么简单;编组和解组实现包含一个 1820-line file 如果您想查看每个细节,您必须阅读。由于其数据结构和功能 Python 的具体性,大部分对象树遍历和序列化都需要从头开始编写。