Antidot et Open Source : Pyckson

Antidot et l’Open Source

Antidot utilise pour le développement de ses produits beaucoup de logiciels Open Source. Et nous essayons, chaque fois que cela est possible, d’apporter en retour notre contribution à la communauté.

Open-SourceCela se fait sous forme de patches / pull request (nous proposons des correctifs qui sont intégrés au logiciel), d’éléments permettant d’enrichir nos plateformes (API, modules…) ou de logiciels autonomes (comme par exemple db2triples qui permet d’exploiter le contenu de bases de données relationnelles avec les technologies du Web Sémantique).

shutterstock_194620346

Il arrive que nos développeurs passionnés commencent sur leur temps personnel une brique technologique qui s’avère être particulièrement utile à notre travail. Nous encourageons alors cet effort et fournissons du temps et des ressources pour accompagner la finalisation d’une première version du projet et sa diffusion (par exemple lors de nos Brown Bags hebdomadaires)

La suite de ce billet de blog est rédigée par Jean Giard, développeur senior à la R&D d’Antidot, qui présente Pyckson, un outil permettant à un logiciel en Python d’importer / exporter facilement des objets en JSON.

Stéphane Loesel

PS – Vous retrouverez nos logiciels OpenSource sur le github d’Antidot à l’adresse :
https://github.com/Antidot

GitHub-Mark  GitHub-Logo

N’hésitez pas à utiliser notre code, le relire, nous poser des questions ou nous proposer des améliorations. Vous pouvez nous joindre à l’adresse opensource@antidot.net


Pyckson : un outil de mapping objet-JSON en python

Un peu d’histoire

Je travaille chez Antidot depuis plus de 5 ans, à ma sortie d’école.

J’ai travaillé pendant 4 ans en Python / C++ sur le moteur de recherche Antidot Finder Suite, où j’ai développé mes connaissances de bases en développement et méthodologie.

Il y a un an et demi je suis passé dans l’équipe qui travaille sur le produit Fluid Topics et développe en Java / Python. J’ai découvert tout un tas de nouveau design-pattern inaccessibles en Java : injection, orm, streams.

D’un autre coté je continuais à m’améliorer en Python mais un truc principal m’embêtait : sérialiser mes objets Python en JSON.

Alors qu’en Java tout avait l’air si simple avec un mix de Jackson / AutoValue, en Python je devais continuer à écrire des classes de sérialisation /désérialisation, ça ne pouvait plus durer !

Quelles solutions ?

J’ai cherché quelques temps si Python avait une librairie pour faire ce genre d’opérations mais je n’ai rien trouvé. Ce qui s’en rapprochait le plus était le module pickle mais il ne correspondait pas à mes principaux besoins :

  •  produire / lire du JSON “propre”, i.e. sans contournement bizarre du genre insérer des infos pour parser l’objet
  •  du camelCase automatique pour respecter le coding-style Python tout en étant compatible avec le style des objects des web-services du serveur en Java
  •  la classe Python doit pouvoir être simple : rien d’autre qu’un constructeur et des attributs

Je me suis donc décidé à écrire ma propre librairie qui répondait a ce besoin : Pyckson

Principes de Pyckson

Pyckson fonctionne en introspectant les constructeurs des classes annotées et celles ci doivent correspondre à une structure bien particulière

  •  tous les paramètres doivent être annotés par leur type.
  •  les paramètres du constructeur doivent être assignés à des attributs du même nom.
  •  Pyckson camelCase automatiquement les noms des attributs pour la sérialisation.
  •  tous les attributs de type non primitif doivent aussi être annotés avec pyckson

Inconvénients

Bien entendu Python n’est pas aussi complet que Java en ce qui concerne le typage / l’introspection et on tombe vite sur quelques contraintes.

Les listes ne peuvent pas être typées, du coup Pyckson utilise une annotation supplémentaire pour indiquer le type du contenu d’une liste.

Les enum python3 ont un nom et une valeur, Pyckson utilise le nom de l’enum pour sérialiser, case sensitive par défaut.

Petits bonus

Pyckson utilise la librairie standard JSON et se charge de la transformation objet -> dictionnaire, du coup on peut aussi utiliser Pyckson pour faire du Yaml ou du Bson (avec MongoDB par exemple).

Pyckson supporte le fait d’utiliser une string pour typer un paramètre, par exemple pour définir une structure récursive.

Pyckson comprend qu’un paramètre est optionnel quand il a une valeur par défaut.

Exemple

Je définis mes objets en Python :

@pyckson
class Foo:
    def __init__(self, value: str):
        self.value = value

@pyckson
@listtype('my_foo_list', Foo)
class Bar:
    def __init__(self, my_foo_list: list):
        self.my_foo_list = my_foo_list

Puis j’appelle Pyckson :

:::python
foos = [Foo('first'), Foo('second')]
bar = Bar(foos)
print(serialize(bar))

> {"myFooList": [{"value": "first"}, {"value": "second"}]}

Lien vers le projet github : https://github.com/antidot/Pyckson

Voilà, vous savez tout sur Pyckson !

Jean Giard