Stocker des Fonctions Python de façon à pouvoir les appeler au sein des formules

Bonjour à tous,

Lors de la journée des utilisateurs de Grist organisée par la DINUM, j’ai eu l’occasion d’échanger avec Grégoire Cutzach au sujet d’une problématique que je rencontrais concernant les formules dans Grist.

Cet échange nous a permis d’identifier une solution pour centraliser certaines fonctions et les réutiliser dans plusieurs formules réparties sur différentes tables et colonnes. Cette approche facilite la maintenance des formules et évite les duplications de code, souvent difficiles à maintenir et à versionner.

Voici une explication de la solution retenue.

Au sein d’une colonne formule (dans notre cas, une colonne nommée fonctions dans une table DEV), il faut d’abord définir les fonctions, puis les stocker dans un dictionnaire avant de retourner ce dernier :

def addition(a, b):
  return a + b

def multiplication(a, b):
  return a * b

fonctions = {
  "addition": addition,
  "multiplication": multiplication
}

return fonctions

Pour appeler une fonction depuis une autre colonne de la même table, il suffit d’accéder à l’élément correspondant du dictionnaire et de lui passer les paramètres souhaités :

$fonctions["addition"](1, 3)

Depuis une autre table, il est possible de récupérer le dictionnaire via un lookupOne() puis d’appeler la fonction souhaitée :

DEV.lookupOne().fonctions["addition"](2, 5)

Voici le lien vers un document montrant cette solution en action : test fonction globale - Grist

3 « J'aime »

Voilà une solution élégante ! Si je comprends bien, elle est moins sensible que la solution ci-dessous, car il n’est pas nécessaire d’exécuter la fonction une première fois pour la charger dans le moteur de données et pouvoir la réutiliser ensuite :

J’ai bon ?

Bonjour !
Oui, normalement il n’y a de nécessité de stocker ou d’activer la formule autre part que dans la colonne du dictionnaire.

1 « J'aime »

Le mieux serait de pouvoir avoir à l’échelle de chaque document dans les paramètres une console python pour pouvoir définir les fonctions customisées

2 « J'aime »

Ca me rappelle GristRUC : GitHub - tomnitschke/gristruc: RUC is reusable user code for Grist - a collection of functions and other reusable stuff for use in your Grist formulas. · GitHub

Le principe est peu ou prou le même : une table pour stocker les fonctions, une astuce pour les appeler dans les autres tables.

Je n’ai pas eu matière à l’utiliser jusqu’ici, le moteur de formule de Grist permettant déjà pas mal d’actions puissantes avec très peu de code, mais ça permettrait de systématiser certains bouts de codes courants : fabrication d’un mailto, historisation de valeurs, rendre une colonne PJ mono-fichier strict, etc.

1 « J'aime »

Tout à fait, j’ai déjà utilisé de “RUC” et c’est vraiment trèèès pratique.