Este módulo contiene funciones que pueden leer y escribir valores de Python en formato binario. El formato es específico de Python, pero independiente de aspectos de la arquitecture de la máquina (es decir, se puede escribir un valor en un PC, transportar el fichero a una Sun y leerlo en ella). Los detalles del formato están sin documentar a propósito; puede cambiar entre versiones de Python (aunque no es usual)3.1.
Éste no es un módulo genérico de persistencia. Si se desea persistencia y transferencia de objetos de Python mediante llamadas a RPC, se debe consultar los módulos pickle y shelve. El módulo marshal existe sobre todo para dar soporte a la escritura y lectura del código ``pseudo-compilado'' de los módulos Python de los ficheros .pyc.
No todos los tipos de objetos de Python están soportados. En general,
sólo los objetos cuyo valor es independiente de una invocación particular a Python
pueden ser escritos y leídos por este módulo. Los siguientes tipos tienen soporte:
None
, enteros, enteros largos, números en coma flotante,
cadenas, objetos Unicode, tuplas, listas, diccionarios, y objetos código,
entendiéndose que las tuplas, listas y diccionarios tienen soporte siempre que
los valores contenidos en ellos tengan soporte a su vez. Las listas y diccionarios
recursivos no se deben utilizar (causan bucles inifinitos).
Ojo: En las máquinas en que el tipo long int
de C tiene más de
32 bits (como la DEC Alpha), es posible crear enteros normales de Python
de más de 32 bits. Como el módulo marshal actual utiliza
32 bits para transferir enteros de Python normales, dicos valores se truncan
sin aviso. Esto afecta particularmente al uso de literales enteros muy grandes
dentro del código fuente, que serán aceptados por el analizador sintáctico,
pero se recortarán sin previo aviso al leerlos del .pyc3.2.
Hay funciones que leen/escrie ficheros, además de funciones que tratan cadenas.
El módulo define las siguientes funciones:
sys.stdout
o los devueltos por open() o
posix.popen(). Debe estar abierto en modo binario
('wb'
o 'w+b'
).
Si el valor (o un valor contenido en él) es de un tipo no soportado, se lanza una excepción ValueError. Además, se escribirá basura en el fichero. El objeto no se recuperará correctamente con load().
'rb'
o 'r+b'
).
Advertencia: Si se escribiio un objeto de un tipo no soportado
con dump(), load() lo sustituirá por
None
.
dump(value, file)
. El valor debe ser de un tipo
soportado. Lanza la excepción ValueError si el valor (o uno de los valores
contenidos en él) tiene un tipo no soportado.