IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Création de noeuds ast contenant des référeces à des objets [Python 3.X]


Sujet :

Python

Vue hybride

maske Création de noeuds ast... 16/11/2017, 14h31
maske Bonjour, alors j'ai... 17/11/2017, 11h28
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut Création de noeuds ast contenant des référeces à des objets
    Bonjour,

    je cherche à modifier dynamiquement la méthode d'une classe en insérant des nouveaux noeuds dans l'ast.

    Les sources de documentation que j'utilise sont : https://docs.python.org/3.5/library/ast.html et https://greentreesnakes.readthedocs.io/en/latest/

    J'ai la méthode suivante dans la classe C :

    def my_method():
    return "ok"

    Je veux insérer un noeud ast tel que ma méthode devienne :

    def my_method():
    tempvar = test
    return "ok"

    Dans mon flot d'exécution j'ai le code suivant :

    test = MyObject()
    node = ast.parse(C.my_method)

    Ici node récupère l'arbre ast de my_method - le code tel quel ne fonctionne pas car il faut récupérer le code source de la méthode, c'est normal mais je vous épargne les détails.

    Donc mon problème c'est que je voudrais prendre ma référence "test", et insérer un nouveau noeud dans "node" qui équivaudrait au code suivant :

    tempvar = test

    Mais attention, "test" est une référence à mon objet instancié plus haut.

    Je n'y arrive pas du tout, alors n'ayant pas l'habitude de jouer avec des ast :

    1 - est-ce que c'est possible d'insérer une référence dans un noeud ast ?
    2 - est-ce que quelqu'un sait le faire ?

  2. #2
    Membre chevronné

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,
    alors j'ai finalement trouvé moi même réponse à ma propre question.

    Je cherchais le moyen d'avoir des objets en tant que nœuds ast, en Pharo smalltalk on a par exemple des instances de LiteralNode. Le fonctionnement que je veux reproduire est (en Pharo) :

    o := MyObject new.
    LiteralNode value: o


    Ça n'est pas possible avec CPython (python par défaut ou original si je comprends bien). Le seul moyen que j'ai trouvé est de conserver l'objet en question dans une variable globale accessible de partout puis d'utiliser le workaround suivant, en pseudo ast python :

    Assign ( Name ('toto', ctx = Store()), value = Call ( [mon appel à une fonction globale qui renvoie mon objet stocké dans ma variable globale ou partagée] )

    J'aime pas du tout car en plus de poser une contrainte sur mon programme, je ne sais pas ce qui peut arriver à mes objets stockés dans mon dictionnaire global - et puis c'est trop con car je l'ai sous la main à tout moment quand j'instrumente mon ast.

    La grammaire pour CPython est ici : https://docs.python.org/3/library/as...stract-grammar

    Donc il y a également PyPy (https://pypy.org/features.html) avec une grammaire étendue (https://bitbucket.org/pypy/pypy/src/...e-view-default) qui elle me fournit le noeud Const. Je peux donc faire :

    o = MyObject()
    ast.Const(o)

    Ça marche directement, et mon programme d'origine est compatible avec l'interpréteur PyPy. Changer d'interpréteur n'est pas un problème pour moi car je suis sur de l'expérimental, et il semble que PyPy est largement compatible avec les plateformes les plus courantes. Je crois comprendre par contre que ça peut-être un choix plus compliqué pour ceux qui ont des contraintes plus fortes.

    Je me disais qu'à défaut d'avoir une réponse, ça intéresserai peut-être quelqu'un et lui évitera ces quelques heures de recherche
    Merci moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/07/2017, 11h25
  2. Ensemble des réels, des complexes, des entiers naturels
    Par ANOVA dans le forum Mathématiques - Sciences
    Réponses: 5
    Dernier message: 08/10/2009, 12h58
  3. Réponses: 19
    Dernier message: 20/12/2006, 10h15
  4. [MySQL] Utilisation des fonctions des récupérations des données
    Par Konrad Florczak dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/10/2006, 15h17
  5. Gestion des majuscules des miniscules des accent
    Par issam16 dans le forum Access
    Réponses: 2
    Dernier message: 13/07/2006, 14h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo