marshal
— Serialización interna de objetos Python¶
Este módulo contiene funciones que pueden leer y escribir valores de Python en un formato binario. El formato es específico de Python, pero independiente de los problemas de arquitectura de la máquina (por ejemplo, puede escribir un valor de Python en un archivo en un PC, transportar el archivo a un Sun y leerlo allí). Los detalles del formato están indocumentados a propósito; pueden cambiar entre las versiones de Python (aunque rara vez lo hacen). 1
Este no es un módulo general de «persistencia». Para la persistencia general y la transferencia de objetos Python a través de llamadas RPC, consulte los módulos pickle
y shelve
. El módulo marshal
existe principalmente para admitir la lectura y escritura del código «pseudocompilado» para los módulos Python de archivos .pyc
. Por lo tanto, los mantenedores de Python se reservan el derecho de modificar el formato de cálculo de referencias de manera incompatible hacia atrás en caso de necesidad. Si va a serializar y deserializar objetos Python, utilice el módulo pickle
en su lugar: el rendimiento es comparable, la independencia de la versión está garantizada y pickle admite una gama sustancialmente más amplia de objetos que marshal.
Advertencia
El módulo marshal
no está destinado a ser seguro contra datos erróneos o construidos maliciosamente. Nunca deserializar con marshal los datos recibidos de una fuente no confiable o no autenticada.
No se admiten todos los tipos de objetos de Python; en general, este módulo solo puede escribir y leer objetos cuyo valor es independiente de una invocación concreta de Python. Se admiten los siguientes tipos: booleanos, enteros, números de punto flotante, números complejos, cadenas de caracteres, bytes, arrays de bytes (bytearray), tuplas, listas, conjuntos (set y frozenset), diccionarios y objetos de código, donde se debe entender que las tuplas, listas, conjuntos y diccionarios solo se admiten siempre que se admitan los valores contenidos en ellos mismos. Los singletons None
, Ellipsis
y StopIteration
también pueden ser marshalled y unmarshalled. Para el formato versión inferior a 3, no se pueden escribir listas, conjuntos ni diccionarios recursivos (véase más adelante).
Hay funciones que leen/escriben archivos, así como funciones que operan en objetos similares a bytes.
El módulo define estas funciones:
-
marshal.
dump
(value, file[, version])¶ Escribe el valor en el archivo abierto. El valor debe ser un tipo admitido. El archivo debe ser un archivo binary file en el que se pueda escribir.
Si el valor tiene (o contiene un objeto que tiene) un tipo no admitido, se produce una excepción
ValueError
— pero los datos no utilizados también se escribirán en el archivo. El objeto no será leído correctamente porload()
.El argumento version indica el formato de datos que
dump
debe usar (véase más adelante).Lanza un evento de auditoría
marshal.dumps
con argumentosvalue
,version
.
-
marshal.
load
(file)¶ Lee un valor del archivo abierto y lo retorna. Si no se lee ningún valor válido (por ejemplo, porque los datos tienen un formato de cálculo de referencias incompatible de una versión de Python diferente), lanza una excepción
EOFError
,ValueError
oTypeError
. El archivo debe ser un binary file habilitado para lectura.Lanza un evento de auditoría
marshal.load
sin argumentos.Nota
Si un objeto que contiene un tipo no admitido se calcula con
dump()
,load()
sustituiráNone
por el tipo «unmarshallable».Distinto en la versión 3.10: Esta llamada solía lanzar un evento de auditoría
code.__new__
para cada objeto código. Ahora lanza un único eventomarshal.load
para toda la operación de carga.
-
marshal.
dumps
(value[, version])¶ Retorna el objeto bytes que se escribiría en un archivo mediante
dump(value, file)
. El valor debe ser un tipo admitido. Lanza una excepciónValueError
sivalue
tiene (o contiene un objeto que tiene) un tipo no admitido.El argumento version indica el formato de datos que
dumps
debe usar (véase más adelante).Lanza un evento de auditoría
marshal.dumps
con argumentosvalue
,version
.
-
marshal.
loads
(bytes)¶ Convierte el objeto bytes-like object en un valor. Si no se encuentra ningún valor válido, lanza una excepción
EOFError
,ValueError
oTypeError
. Se omiten los bytes adicionales de la entrada.Lanza un evento de auditoría
marshal.loads
con argumentobytes
.Distinto en la versión 3.10: Esta llamada solía lanzar un evento de auditoría
code.__new__
para cada objeto código. Ahora lanza un único eventomarshal.loads
para toda la operación de carga.
Además, se definen las siguientes constantes:
-
marshal.
version
¶ Indica el formato que utiliza el módulo. La versión 0 es el formato histórico, la versión 1 comparte cadenas internadas y la versión 2 utiliza un formato binario para los números de punto flotante. La versión 3 agrega compatibilidad con la creación de instancias de objetos y la recursividad. La versión actual es 4.
Notas al pie
- 1
El nombre de este módulo proviene de algunos términos utilizados por los diseñadores de Modula-3 (entre otros), que utilizan el término «marshalling» para el envío de datos de forma auto-contenida. Estrictamente hablando «marshalling», significa convertir algunos datos internos en un formato externo (por ejemplo, en un búfer RPC) y «unmarshalling» es el proceso inverso.