12.4. marshal — Sérialisation interne des objets Python


Ce module contient des fonctions permettant de lire et écrire des valeurs Python au format binaire. Ce format est propre à Python, mais indépendant de l’architecture de la machine (p. ex., vous pouvez écrire une valeur Python dans un fichier sur un PC, envoyer le fichier vers une machine Sun et la lire à nouveau). Les détails du format sont volontairement non documentés ; il peut changer d’une version Python à l’autre (bien que ce soit rarement le cas). 1

Ce module ne permet pas de « sérialiser » des objets de manière permanente. Pour des questions de sérialisation en général ou de transfert d’objets Python par des appels RPC, référez-vous aux modules pickle et shelve. Le module marshal existe principalement pour permettre la lecture et l’écriture de code « pseudo-compilé » pour les modules Python des fichiers .pyc. Par conséquent, les mainteneurs Python se réservent le droit de modifier le format marshal en cassant la rétrocompatibilité si besoin. Si vous sérialisez et dé-sérialisez des objets Python, utilisez plutôt le module pickle — les performances sont comparables, l’indépendance par rapport à la version est garantie, et pickle prend en charge une gamme d’objets beaucoup plus large que marshal.

Avertissement

N’utilisez pas le module marshal pour lire des données erronées ou malveillantes. Ne démantelez jamais des données reçues d’une source non fiable ou non authentifiée.

Tous les types d’objets Python ne sont pas pris en charge ; en général, seuls les objets dont la valeur est indépendante d’une invocation particulière de Python peuvent être écrits et lus par ce module. Les types suivants sont pris en charge : booléens, entiers, nombres à virgule flottante, nombres complexes, chaînes de caractères, octets, bytearrays, n-uplets, listes, ensembles, ensembles figés, dictionnaires et objets, étant entendu que les n-uplets, listes, ensembles, ensembles figés et dictionnaires sont pris en charge si les valeurs qu’ils contiennent sont elles-mêmes prises en charge. Les singletons None, Ellipsis et StopIteration peuvent également être « pseudo-compilés » et « dé-pseudo-compilés ». Pour le format des versions inférieures à 3, les listes récursives, les ensembles et les dictionnaires ne peuvent pas être écrits (voir ci-dessous).

Il existe des fonctions de lecture-écriture de fichiers ainsi que des fonctions opérant sur des objets octet.

Le module définit ces fonctions :

marshal.dump(value, file[, version])

Écrit la valeur sur le fichier ouvert. La valeur doit être un type pris en charge. Le fichier doit être un fichier binaire ouvert en écriture.

Si la valeur est (ou contient un objet qui est) d’un type non implémenté, une exception ValueError est levée — mais le contenu de la mémoire sera également écrit dans le fichier. L’objet ne sera pas correctement lu par load().

L’argument version indique le format de données que le dump doit utiliser (voir ci-dessous).

marshal.load(file)

Lit une valeur du fichier ouvert et la renvoie. Si aucune valeur valide n’est lue (p. ex. parce que les données ont un format décompilé incompatible avec une autre version de Python), EOFError, ValueError ou TypeError est levée. Le fichier doit être un fichier binaire ouvert en lecture.

Note

Si un objet contenant un type non pris en charge a été dé-compilé avec dump(), load() remplacera le type non « dé-compilable » par None.

marshal.dumps(value[, version])

Renvoie les octets qui seraient écrits dans un fichier par dump(value, file). La valeur doit être un type pris en charge. Lève une exception ValueError si la valeur a (ou contient un objet qui a) un type qui n’est pas pris en charge.

L’argument version indique le format de données que dumps doivent utiliser (voir ci-dessous).

marshal.loads(bytes)

Convertit le bytes-like object en une valeur. Si aucune valeur valide n’est trouvée, EOFError, ValueError ou TypeError est levée. Les octets supplémentaires de l’entrée sont ignorés.

De plus, les constantes suivantes sont définies :

marshal.version

Indique le format que le module utilise. La version 0 est le format originel, la version 1 partage des chaînes de caractères internes et la version 2 utilise un format binaire pour les nombres à virgule flottante. La version 3 ajoute la prise en charge de l’instanciation et de la récursivité des objets. La version actuelle est la 4.

Notes

1

Le nom de ce module provient d’un peu de terminologie utilisée par les concepteurs de Modula-3 (entre autres), qui utilisent le terme marshalling pour l’envoi de données sous une forme autonome. À proprement parler, to marshal signifie convertir certaines données d’une forme interne à une forme externe (dans une mémoire tampon RPC par exemple) et unmarshalling désigne le processus inverse.