该模块包含可以二进制格式读写Python值的函数。该格式特定于Python,但与机器架构问题无关(例如,您可以将Python值写入PC上的文件,将文件传输到Sun,然后将其读回)。格式细节有意无证; 它可能会在Python版本之间发生变化(虽然它很少)。[1]

这不是一般的“持久性”模块。有关通过RPC调用的Python对象的一般持久性和传输,请参阅模块pickleshelve。该marshal模块主要用于支持读取和编写Python模块.pyc文件的“伪编译”代码。因此,Python维护者保留在需要时以向后不兼容的方式修改编组格式的权利。如果您正在对Python对象进行序列化和反序列化,请使用该pickle模块 – 性能可比,版本独立性得到保证,并且pickle支持比marshal更广泛的对象。

警告

marshal模块不是为了防止错误或恶意构造的数据。永远不要从不受信任或未经身份验证的来源解组数据。

并非所有Python对象类型都受支持; 通常,此模块只能编写和读取其值独立于Python的特定调用的对象。支持以下类型:布尔值,整数,浮点数,复数,字符串,字节,字节数组,元组,列表,集合,frozensets,字典和代码对象,其中应该理解元组,列表,集合,frozensets只有支持其中包含的值,才支持字典和字典。在单身NoneEllipsis并且StopIteration还可以编组和解组。对于低于3的格式版本,无法编写递归列表,集合和词典(请参见下文)。

有些函数可以读/写文件以及在类字节对象上运行的函数。

该模块定义了这些功能:

marshal.dump文件[版本
将值写在打开的文件上。该值必须是受支持的类型。该文件必须是可写的二进制文件

如果该值具有(或包含具有不支持类型的对象), ValueError则会引发异常 – 但也会将垃圾数据写入该文件。该对象将无法正确读回load()

版本的说法表示数据格式dump应使用(见下文)。

marshal.load文件
从打开的文件中读取一个值并将其返回。如果没有有效的读取值(例如,因为数据有不同的Python版本的不兼容元帅格式),提高EOFErrorValueErrorTypeError。该文件必须是可读的二进制文件

注意

如果编组了包含不受支持类型的对象dump(), load()则将替换Noneunmarshallable类型。

marshal.dumps[版本
返回将写入文件的bytes对象。该值必须是受支持的类型。养异常,如果值具有(或包含具有的对象)不支持的类型。dump(value, file)ValueError

版本的说法表示数据格式dumps应使用(见下文)。

marshal.loads字节
将类字节对象转换为值。如果没有找到有效的价值,提高 EOFErrorValueErrorTypeError。输入中的额外字节将被忽略。

此外,还定义了以下常量:

marshal.version
指示模块使用的格式。版本0是历史格式,版本1共享内部字符串,版本2使用二进制格式表示浮点数。版本3增加了对对象实例化和递归的支持。目前的版本是4。

脚注

[1] 这个模块的名称源于Modula-3(以及其他)的设计者使用的一些术语,他们使用术语“编组”以自包含的形式传送数据。严格来说,“编组”意味着将一些数据从内部转换为外部形式(例如在RPC缓冲区中),并将“解组”转换为反向过程。