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 :

Stoper un appelle recursif


Sujet :

Python

  1. #1
    Membre expérimenté
    Homme Profil pro
    Recherche du travail
    Inscrit en
    Août 2004
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Recherche du travail

    Informations forums :
    Inscription : Août 2004
    Messages : 561
    Points : 1 320
    Points
    1 320
    Par défaut Stoper un appelle recursif
    Bonjour,

    Je dispose d'une classe qui utilise l'attribut __getattr__.
    Se qui me permet de faire des appelles du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_classe.machin.bidule.blabla()
    Mon problème: Quand la classe ne trouve pas le résulta escompté. Par exemple "machin" (cf exemple) n'existe pas. Je revois quelque chose. Donc python va continuer a chercher bidule puis blabla. Comment faire pour qu'il arrete sa recherche? Je prcise que je veux apporter des modification interne a la classe

    Merci d'avance
    Avoir un regard neutre sur notre vie dénuée de sens, c'est la voir tel un ignorant
    ------------------------------------------------------------------------------------------------------

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne suis pas sûr d'avoir compris ton pb. Mais si 'machin' n'existe pas, une tentative d'accès devrait déclencher une exception. Peut-être peux-tu utiliser cette exception dans un try:...except: comme condition d'arrêt de la récursion?

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Mets un ECM, c'est à dire un Exemple Complet Minimal car là la question est trop vague.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Salut,

    __getattr__ n'est activé par l'interprêteur que s'il ne trouve pas l'attribut dans le __dict__ de l'instance/classe correspondante.

    Exemple: Pour X = ma_classe, X.machin ne passera dans __getattr__ que si 'machin' n'est pas un attribut de X.
    Cachons machin dans self._machin.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def __getattr__(self, key):
        if hasattr(key, self._machin) return getattr(self._machin)
        raise Exception('pas de %s dans machin' % key)

    Mon problème: Quand la classe ne trouve pas le résultat escompté. Par exemple "machin" (cf exemple) n'existe pas.
    Quand çà boucle (chez moi) , c'est que j'ai des mélanges indus avec __setattr__


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre expérimenté
    Homme Profil pro
    Recherche du travail
    Inscrit en
    Août 2004
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Recherche du travail

    Informations forums :
    Inscription : Août 2004
    Messages : 561
    Points : 1 320
    Points
    1 320
    Avoir un regard neutre sur notre vie dénuée de sens, c'est la voir tel un ignorant
    ------------------------------------------------------------------------------------------------------

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Salut,
    Chez moi çà ne boucle pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (v_python_26)bash-3.2$ python Tree.py
    # LibBYC:Tree->main.__eq__->Verifie l'existance
    # LibBYC:Tree->main.__eq__->Verifie l'existance du noeud
    10 Le noeud __eq__ n'existe pas
    Traceback (most recent call last):
      File "Tree.py", line 6, in <module>
        tree.insert('test1', liby.tree.new())
      File "/Volumes/MacOSX_Ext/KITS/test/liby/tree.py", line 94, in insert
        if noeud_parent == 0:
    TypeError: 'dict' object is not callable
    mais çà ne raconte pas de jolies choses: pourquoi après avoir testé l'existence d'__eq__, on se retrouve avec un dict dans noeud_parent (au lieu du zéro attendu) qui est un message d'erreur??
    J'ai passé trop de temps dans les arbres récemment pour pouvoir lire votre code sans me faire mal aux yeux
    Simplifiez
    Le noeud d'un arbre est quelque chose de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Node(object):
        def __init__(self, name, parent=None):
             super(Node, self).__init__()
             self._name = name
             self._parent = parent
             self._childs = dict()
    Soit n un Node bien fait, insérer un fils est de la forme:
    fils = n.insert('fils')
    insert ne rale que si 'fils' est dans self._childs, sinon il s'exécute et retourne un nouveau 'fils' de n après l'avoir inséré dans le _childs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def insert (self, name):
             if name in self._childs: return None
             else: self._childs[name] = Node(name, parent=self)
    ou est la racine?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def get_root(self):
             if self._parent == None: return self
             return self._parent.getroot()
    etc...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. appel recursif de makefile
    Par yan dans le forum Systèmes de compilation
    Réponses: 3
    Dernier message: 13/01/2010, 21h48
  2. variable appel recursifs
    Par laurentibus dans le forum Général Java
    Réponses: 3
    Dernier message: 02/04/2008, 14h54
  3. Pb Appel recursif d'objet.
    Par sebastien2222 dans le forum Langage
    Réponses: 5
    Dernier message: 05/06/2006, 18h33
  4. Appel recursif avec template
    Par Math75 dans le forum Langage
    Réponses: 24
    Dernier message: 13/10/2005, 12h57
  5. Appel recursif au constructeur
    Par Math75 dans le forum C++
    Réponses: 1
    Dernier message: 11/10/2005, 16h48

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