"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 por "load()".

   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 argumentos
   "value", "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" o
   "TypeError".  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 evento "marshal.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ón "ValueError" si "value" 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 argumentos
   "value", "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" o "TypeError".  Se omiten los bytes adicionales de la
   entrada.

   Lanza un evento de auditoría "marshal.loads" con argumento "bytes".

   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 evento "marshal.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.
