4. Définir une macro-commande en Python#
Il faut définir :
le catalogue proprement dit des mots-clés composant la macro,
la méthode de typage des structures de données produites,
la méthode Python définissant le corps de la macro : les commandes « de base » produites par la macro et leur enchaînement.
Les deux premiers points sont communs avec l’écriture d’une commande ordinaire (à l’exception d’une différence mineure dans la méthode de typage).
Il est possible de restituer tout ceci dans le catalogue de commandes du code et de rendre ainsi la macro-commande visible de tous. On peut également conserver son développement privé avec l’avantage de ne pas avoir à modifier les paramètres d’exécution ou l’exécutable en plaçant ces trois éléments directement en tête du fichier de commandes, ou en les important (import Python) depuis une localisation convenue.
4.1. Écrire le catalogue de la macro-commande#
Le catalogue d’une macro est semblable à celui d’un commande simple. Les trois différences sont :
on déclare un objet MACRO(et non PROCou OPER),
le mot clé réservé opne contient pas un entier (désignant le numéro de routine FORTRAN de haut niveau pour OPERet PROC) mais un nom de méthode python,
le concept produit n’est pas nécessairement unique, déclaré à gauche du signe « = ».
Des concepts produits peuvent être spécifiés en tant qu’arguments d’un mot clé simple. Un mot-clé simple qui définit un concept à produire est déclaré de type CO:
NUME_DDL = SIMP(statut='f',typ=CO)
Le type de l’objet retourné sera défini dans la fonction sd_prod (cf. paragraphe suivant).
Un même mot-clé peut avoir un double rôle: prendre un concept en argument ou produire un nouveau concept. Par exemple, on écrirait:
NUME_DDL = SIMP(statut='f',typ=(nume_ddl_sdaster, CO))
Cet usage est fortement déconseillé pour les développements futurs. Il est conseillé de définir un mot-clé pour chacune des fonctions.
4.2. Définir le type des concepts produits#
La définition du type des concepts produits d’une macro-commande s’effectue de manière semblable à celle d’une commande simple de type OPER.
Si la commande ne produit qu’un concept que l’on trouvera à gauche du signe = comme dans :
a =COMMANDE()
on procédera de la même manière que pour une commande simple de type OPER.
Dans le cas où la macro-commande peut produire plusieurs concepts dont certains en arguments de mots-clés, il faut ajouter quelques informations supplémentaires. Tout d’abord, il faut absolument fournir une fonction Python, nommée sd_prod, dans la définition de la macro. Ensuite, les mots clés simples contenant le nom utilisateur du concept à produire doivent être de type CO(nom réservé).
Par exemple :
def ma_macro_prod(self, NUME_DDL, MATRICE,**args):
if args.get(“__all__”): return ([evol_noli], [nume_dll_sdaster], [None, matr_asse_depl_r])
self.type_sdprod(NUME_DDL, nume_ddl_sdaster) if MATRICE: self.type_sdprod(MATRICE, matr_asse_depl_r) return evol_noli
MA_MACRO =MACRO(sd_prod=ma_macro_prod,…
4.2.1. MATRICE = SIMP(statut=’f’, typ=CO),#
NUME_DDL = SIMP(statut=’o’, typ=nume_ddl_sdaster),)
Dans ce cas, trois concepts peuvent être produits :
de façon classique, un concept de type evol_noliqui aura été donné par l’utilisateur à gauche du signe « = ».
un concept de type matr_asse_depl_rsi l’utilisateur renseigne le mot clé simple MATRICE.
un concept nume_ddldont le nom est fourni au mot-clé NUME_DDL.
Lorsqu’un mot-clé peut avoir en argument un concept à produire, le mot-clé doit apparaître dans la liste des arguments de la fonction sd_prodet le concept doit être typé en utilisant la méthode type_sdprodde l’argument selfqui est l’objet macro-commande.
NB: L’argument selfn’est pas présent pour un OPERou une PROC (il s’agit de l’objet MACRO).
Comme pour les commandes (cf. [D5.01.01]), la fonction sd_proddoit retourner l’ensemble des types possibles si __all__=True. Comme la macro-commande peut retourner plusieurs objets (3 dans l’exemple), si __all__=True, la fonction retourne une liste de 3 listes de types possibles, une liste pour chaque résultat.
Si un résultat n’est pas systématiquement produit (ici pour MATRICE), les types possibles sont alors None(rien n’est produit) et les véritables types.
Si la macro-commande ne retourne pas de résultat à gauche du signe «=», la première liste vaut alors [None](à la place de [evol_noli]ici).
Dans certains cas, une macro-commandes retournent un nombre indéfini de résultats (un par occurrence d’un mot-clé facteur). Dans ce cas, on ne répète pas la liste correspondante.