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 :

Evaluation d'un nom de fonction [Fait]


Sujet :

Python

  1. #1
    uaz
    uaz est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 13
    Points
    13
    Par défaut Evaluation d'un nom de fonction
    Please help
    J'essaie d'évaluer le nom d'une fonction, mais pour le moment je me contente simplement de l'objet puisque même ça, ça ne marche pas.

    Le but est de récupérer l'objet représentant la fonction en vue de travailler avec son prototype, ses arguments etc..

    Le problème : eval("nom_variable.nom_fonction") ne fonctionne pas
    Ce qui provoque cette erreur : apparemment nom_variable n'est pas déclaré dans l'instance de classe courante (???)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    NB_LIB = 7
     
    class Librairies:  
        def __init__(self, environnement):
            self.__env = environnement  # Reference sur l'environnement
            self.__lib = []             # Ensemble des librairies fonctionnelles
            for i in range(NB_LIB):
                self.__lib.append(None)
     
        def getLibFonction(self, fonction):
            print self.__lib[0]            # marche
            print eval("self.__lib[0]") # marche pas
           # ...
    None
    Traceback (most recent call last):
    File "C:\PROGRA~1\lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
    File "P:\travail\solution\Start.py", line 121, in ?
    main()
    File "P:\travail\solution\Start.py", line 119, in main
    st=Start("P:\\travail\\solution\\test3.xml")
    File "P:\travail\solution\Start.py", line 27, in __init__
    self.__executerJeuDeTests()
    File "P:\travail\solution\Start.py", line 63, in __executerJeuDeTests
    init.executer()
    File "P:\travail\solution\Test.py", line 71, in executer
    lib = self.getLibrairies().getLibFonction(self.__fonction)
    File "P:\travail\solution\Librairies.py", line 40, in getLibFonction

    File "<string>", line 0, in ?
    AttributeError: Librairies instance has no attribute '__lib'

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 89
    Points : 114
    Points
    114
    Par défaut
    Avec un attribut public ça marche:
    >>> class A:
    ...````def __init__(this):
    ...````````this.x = 1
    ...````def test(this):
    ...````````print this.x
    ...````````print eval('this.x')
    ...
    >>> a = A()
    >>> a.test()

    1
    1
    Avec un attribut privé ça foire:
    >>> class B:
    ...````def __init__(this):
    ...````````this.__x = 1
    ...````def test(this):
    ...````````print this.__x
    ...````````print eval('this.__x')
    ...
    >>> b = B()
    >>> b.test()

    1
    Traceback (most recent call last):
    File "<stdin>", line 1, in ?
    File "<stdin>", line 6, in test
    File "<string>", line 0, in ?
    AttributeError: B instance has no attribute '__x'
    Apparemment eval sort du contexte de l'instance de classe, et comme __x n'est pas un attribut accessible de l'extérieur, il lève une exception.
    Comme solution, je proposerais de copier le contenu dans un attribut public temporaire:
    >>> class C:
    ...````def __init__(this):
    ...````````this.__x = 1
    ...````def test(this):
    ...````````print this.__x
    ...````````this.tmpAttr = this.__x
    ...````````print eval('this.tmpAttr')
    ...````````del(this.tmpAttr)
    ...
    >>> c = C()
    >>> c.test()

    1
    1

    >>> c.tmpAttr
    Traceback (most recent call last):
    File "<stdin>", line 1, in ?
    AttributeError: C instance has no attribute 'tmpAttr'

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

Discussions similaires

  1. Nom de fonction introuvable
    Par Jérémy VAUTIER dans le forum Access
    Réponses: 4
    Dernier message: 01/03/2006, 09h50
  2. Cherche nom de fonction
    Par DeezerD dans le forum Langage
    Réponses: 4
    Dernier message: 15/10/2005, 01h14
  3. Evaluations des paramètres d'une fonction
    Par WebPac dans le forum Langage
    Réponses: 15
    Dernier message: 06/10/2005, 09h46
  4. Réponses: 2
    Dernier message: 04/10/2005, 15h13
  5. Nom de fonction dynamique
    Par gege2061 dans le forum C
    Réponses: 2
    Dernier message: 21/06/2005, 14h44

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