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 :

Découpage en plusieurs classes..?


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Par défaut Découpage en plusieurs classes..?
    Bonjour à tous,

    Mon souci je crois est que je n'ai pas encore bien assimilé le modèle objet, j'ai mon programme en python qui marche à peu près le problème c'est que j'aimerai séparer ce qui est graphique de mes fonctions :

    exemple de mon programme mal structuré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class MeP_Form(QDialog):
        "Interface du plugin MeP"
        def __init__(self, iface):
     
            #Une fenetre Dialogue
            QDialog.__init__(self)
            self.iface=iface
            self.setFixedSize(800, 600)
            self.setWindowTitle("Mise en Page Automatique")
     
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            cb_orientation= QComboBox()
            cb_orientation.addItem("Paysage")
            ...
     
            def lbl_Redimension(strPortrait):
     
                if strPortrait == "Portrait":
                    label_ApercuImage.setFixedSize(315, 445)
                else:
                    label_ApercuImage.setFixedSize(445, 315)
                changement_thematique(cb_thematique.currentText())
                pb_Validemodele.setText(str(function.crado))
                resume_Info()
           ...
    Pour l'instant j'arrive à avoir deux modules avec une classe chacun, le problème c'est que je n'arrive pas à agir sur "cb_orientation" par exemple enfin tous les éléments graphiques que j'ai mis dans la classe MeP :

    ma deuxieme classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MeP_Function(object):
        """Methodes simple liees a l'interface"""
        def __init__(self):
            self.attribut1 = "attribut1 ok"
        def base (self):
            return self.attribut1+"Yopiyo"
            #Ici j'aimerai appelle cb_orientation en faisant
            #MeP_Form.cb_orientation.methodx()
    Une erreur survient et me signale que MeP_Form n'a pas d'attribut cb_orientation comment puis-je faire ? Ai-je oublié quelque-chose ? Qu'est-ce que je n'ai pas encore saisi ?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 871
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benbannock Voir le message
    Bonjour à tous,

    Mon souci je crois est que je n'ai pas encore bien assimilé le modèle objet, j'ai mon programme en python qui marche à peu près le problème c'est que j'aimerai séparer ce qui est graphique de mes fonctions :

    exemple de mon programme mal structuré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class MeP_Form(QDialog):
        "Interface du plugin MeP"
        def __init__(self, iface):
     
            #Une fenetre Dialogue
            QDialog.__init__(self)
            self.iface=iface
            self.setFixedSize(800, 600)
            self.setWindowTitle("Mise en Page Automatique")
     
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            cb_orientation= QComboBox()
            cb_orientation.addItem("Paysage")
            ...
     
            def lbl_Redimension(strPortrait):
     
                if strPortrait == "Portrait":
                    label_ApercuImage.setFixedSize(315, 445)
                else:
                    label_ApercuImage.setFixedSize(445, 315)
                changement_thematique(cb_thematique.currentText())
                pb_Validemodele.setText(str(function.crado))
                resume_Info()
           ...
    Pour l'instant j'arrive à avoir deux modules avec une classe chacun, le problème c'est que je n'arrive pas à agir sur "cb_orientation" par exemple enfin tous les éléments graphiques que j'ai mis dans la classe MeP :

    ma deuxieme classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MeP_Function(object):
        """Methodes simple liees a l'interface"""
        def __init__(self):
            self.attribut1 = "attribut1 ok"
        def base (self):
            return self.attribut1+"Yopiyo"
            #Ici j'aimerai appelle cb_orientation en faisant
            #MeP_Form.cb_orientation.methodx()
    Une erreur survient et me signale que MeP_Form n'a pas d'attribut cb_orientation comment puis-je faire ? Ai-je oublié quelque-chose ? Qu'est-ce que je n'ai pas encore saisi ?
    Exact. La classe, c'est à dire le modèle "MeP_Form" n'a pas d'atribut cb_orientation.
    C'est la variable de type "Mep_Form" qui a cet attribut !!!
    Exemple: a=Mep_Form()
    a.cb_orientation() => ça ça marche

    Faut essayer de voir l'objet à travers un exemple. Imaginons l'objet "voiture". Une voiture possède des éléments généraux et abstraits comme le nb de roues, la couleur, la vitesse, etc. Mais tant que tu ne parles pas d'une voiture précise, ces éléments restent abstraits et n'ont aucune réalité. Tu peux pas demander "voiture.vitesse()" car personne ne sait de quelle voiture tu parles. Te faudra d'abord créer la variable "X" de type "voiture" puis affecter à cette variable "X" sa vitesse, sa couleur, etc...

    Ensuite quand tu seras plus à l'aise, on pourra parler de méthodes et membres statiques qui peuvent s'utiliser avec une classe sans avoir de variable associée à cette classe mais ce sera pour après...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Salut,

    Pour l'instant j'arrive à avoir deux modules avec une classe chacun
    Veux-tu dire que la classe MeP_Form(QDialog) se trouve dans un module1.py
    et que la classe MeP_Function(object) se trouve dans un module2.py
    et que tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import module1
    import module2
    pour disposer de
    module1.MeP_Form
    et module2.MeP_Function
    dans ton programme ?





    Si cb_orientation= QComboBox() est une fonction dont les valeurs retournées sont indépendantes de toute instance de MeP_Form(QDialog) ,
    je pense que tu peux en faire un attribut de la classe MeP_Form(QDialog) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class MeP_Form(QDialog):
        "Interface du plugin MeP"
     
        cb_orientation= QComboBox()
        cb_orientation.addItem("Paysage")
     
        def __init__(self, iface):
     
            #Une fenetre Dialogue
            QDialog.__init__(self)
            self.iface=iface
            self.setFixedSize(800, 600)
            self.setWindowTitle("Mise en Page Automatique")
     
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            ...

    Dès lors, l’appel MeP_Form.cb_orientation.methodx() devrait marcher.
    Devrait, si j'ai bien compris le problème et si je ne me trompe pas....

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Par défaut
    Ok je crois comprendre, alors j'ai passé mon instance de classe en paramètre pour le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MeP_Function(object):
        """Methodes simple liees a l'interface"""
        def __init__(self,truc):
            self.attribut1 = "attribut1 ok"
            self.objetMeP_Form = truc
     
        def base (self):
            self.objetMeP_Form.pb_Validemodele.setText("ma fonction est bonne")
            return self.attribut1+"Yopiyo"
            #pb_Validemodele est un Push button déclaré dans MeP_Form


    Veux-tu dire que la classe MeP_Form(QDialog) se trouve dans un module1.py
    et que la classe MeP_Function(object) se trouve dans un module2.py
    et que tu fais
    Code :

    import module1
    import module2

    pour disposer de
    module1.MeP_Form
    et module2.MeP_Function
    dans ton programme ?
    C'est exactement ca !

    Peut-être que le fait d'avoir mis mes éléments graphiques dans le "constructeur" __init__ de MeP_Form est problématique, je les ai déplacé et mis comme ton code le montre entre la déclaration de classe et la méthode __init__ et ca marche !!!

    Par contre je ne comprends pas pourquoi ??

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Par défaut
    J'ai posté trop vite, je n'ai plus de message d'erreur mais j'ai l'impression que la méthode suivante :
    self.objetMeP_Form.pb_Validemodele.setText("ma fonction est bonne")

    ne s'execute pas enfin du moins le texte ne change pas alors que lorsque je fais directement dans ma classe
    pb_Validemodele.setText("texte blabla")

    ca marche là je suis interloqué....

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Peut-être que le fait d'avoir mis mes éléments graphiques dans le "constructeur" __init__ de MeP_Form est problématique
    Ça dépend ce qu’on entend par problématique.

    Par contre je ne comprends pas pourquoi ??
    C’est une bonne remarque, il faut comprendre les erreurs si on ne veut pas faire de la bidouille.

    La présence d’instructions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            cb_orientation= QComboBox()
            cb_orientation.addItem("Paysage")
    dans la fonction __init__() (j’hésite à l’appeler constructeur, il y a un débat là dessus)
    crée simplement des objets bg_1, rb_A4, cb_orientation en tant qu’objets locaux, c’est à dire des objets dont les identifiants apparaissent dans l’espace de noms local à la fonction __init__() .

    Cette dernière a un rôle particulier, mais ce n’est après tout qu’une fonction qui n’est en elle même pas particulière. Aussi quand on lui dit de créer des objets locaux, elle le fait , et quand l’exécution de la fonction __init__() est terminée, son espace de noms disparaît et donc les objets bg_1, rb_A4, cb_orientation n’existent ensuite plus.
    À ce niveau , il n’y a pas d’erreur, l’exécution n’est pas problématique.
    Illustration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A:
        def __init__(cap,nom):
            cap.name = nom
            n = 190
            ch = 'je suis une chaine locale'        
            print '\n'.join(repr(u) for u in locals().iteritems())
     
    x = 'je suis une chaine globale'
    a = A('soleil')
    print a.__init__.ch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ('nom', 'soleil')
    ('cap', <__main__.A instance at 0x010BA990>)
    ('ch', 'je suis une chaine locale')
    ('n', 190)
    
    Traceback (most recent call last):
      File "E:\Python\python27 12juillet10\essaii44.py", line 10, in <module>
        print a.__init__.ch
    AttributeError: 'function' object has no attribute 'ch' 
    Là où ça devient problématique, c’est quand tu cherches à utiliser l’un de ces objets disparus. Mais c’est un problème d’algorithme, pas du code en lui même.









    je les ai déplacé et mis comme ton code le montre entre la déclaration de classe et la méthode __init__ et ca marche !!!
    J'ai posté trop vite, je n'ai plus de message d'erreur
    Je pense que le « ça marche » signifiait que tu n’avais plus de message d’erreur.

    Soit dit en passant, il est hautement intéressant pour ceux qui essaient d’apporter des solutions de voir les messages d’erreurs pour mieux analyser ce qui se passe.
    Il faut donc poster les messages d’erreur.






    alors j'ai passé mon instance de classe en paramètre pour le constructeur
    Ce qu’on passe n’est pas un paramètre, c’est un argument.

    Un paramètre est seulement un symbole présent à au moins deux endroits dans un code, destiné à symboliser où va se retrouver utilisé dans le code un argument qui sera passé à la première position du paramètre. Ce n’est pas l’identifiant d’un objet comme l’est un argument.







    Pour que
    self.objetMeP_Form.pb_Validemodele.setText("ma fonction est bonne")
    s’exécute, il faut qu’elle soit appelée.

    Telle qu’elle est placée dans le code ci-dessus, il faut pour cela que MeP_Function.base() soit elle même appelée.

    Est-ce le cas ?

    Pourrais tu nous montrer le code concerné, ce serait quand même plus pratique.


    Il faudrait aussi qu’on comprenne où dans le code la fonction pb_Validemodele.setText() est définie.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,
    Le problème de la séparation est de pouvoir recoller les bouts ensuite.
    Je vous propose ce découpage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #module1, à priori ignore module2
     
    class MeP_Function(object):
        """Methodes simple liees a l'interface"""
        def __init__(self):
            object.__init__(self)             # on ferme le MI
            self.attribut1 = "attribut1 ok"
     
        def base (self):
            return self.attribut1+"Yopiyo"
            #Ici j'aimerai appelle cb_orientation en faisant
            self.cb_orientation.methodx()
     
    #module2
    from module1 import MeP_Function
    #...
    class MeP_Form(QDialog, MeP_Function):    # heritage MI: MeP_Function
                                              # ignore les details de l'interface'
                                              # graphique
        "Interface du plugin MeP"
        def __init__(self, iface):
     
            #Une fenetre Dialogue
            super(MeP_Form, self).__init__()
            #...
            cb_orientation= QComboBox()
            cb_orientation.addItem("Paysage")
    La classe Mep_Function ne doit pas être utilisée en temps que telle: on instancie Mep_Form (d'une façon ou d'une autre). Par contre, l'appelant appelle les méthodes de Mep_Function qui utilisent les méthodes de Mep_Form.
    Le découpage en module ajoute une difficulté supplémentaire qu'il n'est peut être pas utile de traiter dans un premier temps... mais bon pourquoi pas?

    "d'une façon ou d'une autre"...
    Comment fabriquer une Mep_Form si on ne voit que Mep_Function? Vous avez plusieurs solutions. Celle que je préfère est __new__ dans Mep_Function qui retourne une Mep_Form mais c'est un peu dur pour les neurones! Vous pouvez vous contenter d'une fonction Mep_Form2 qui fasse 'factory' pour retourner une instance de la bonne classe.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Par défaut
    Tout d'abord merci à tous de vos réponses,

    Je vais tenter d'être clair

    Essayons de résumer, j'ai deux modules, et je voulais séparer la partie "graphique" de la partie "métier" (qui est très simple...).

    J'ai utilisé la solution de wiztricks, j'ai par conséquent un module avec une classe qui hérite d'une autre situé dans un second module. Second module dans lequel je peux retrouver toutes mes fonctions. J'ai laissé dans mon code des commentaires comportant quelques questions, si quelqu'un peut y répondre ca serait top... voici mon code :

    pour le module "MeP_Gui" (module1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #! /usr/bin/python
    #-*-coding: utf-8 -*-
    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    from PyQt4.QtXml import *
    from qgis.core import *
    from qgis.gui import *
    import os,sys
    import glob, re
    import os.path
    from MeP_BasicFunction import MeP_Function
     
    class MeP_Form(QDialog, MeP_Function):
        "Interface du plugin MeP"
     
        pb_Validemodele = QPushButton()
        pb_Validemodele.setText("&"+qApp.trUtf8("Charger le Modèle")) 
                                                       #pb_Validemodele est un attribut?
                                                       #une variable globale ???
     
     
        "Interface du plugin MeP"
        def __init__(self, iface):   #J'initialise ma classe "constructeur"
     
            super(MeP_Form, self).__init__() #J'appelle le constructeur hérité de MeP_Form
     
            #Une fenetre Dialogue
            QDialog.__init__(self) #J'appelle le second constructeur hérité
            self.iface=iface
            self.setFixedSize(800, 600)
            self.setWindowTitle("Mise en Page Automatique")
     
     
            # J'avais défini mon interface dans le constructeur de ma classe,
            # est-ce le bon endroit ?
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            rb_A3 = QRadioButton("A3")
            bg_1.addButton(rb_A4)
            bg_1.setId(rb_A4, 1)
            bg_1.button(1).setChecked(True)
            bg_1.addButton(rb_A3)
            ...
            ...
            self.base2(pb_Validemodele)
            # je peux maintenant appeler la méthode base2() héritée
            # qui fait partie de mon objet c'est bien ca ?
            # et je passe mon pushBouton en paramètre.
            ...
            ...
            #SIGNAL_SLOT
            self.connect(cb_orientation, SIGNAL("currentIndexChanged(const QString&)"), lbl_Redimension)
            ...
    pour le module "MeP_BasicFunction" (module2) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #! /usr/bin/python
    #-*-coding: utf-8 -*-
    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    from PyQt4.QtXml import *
    from qgis.core import *
    from qgis.gui import *
    import os,sys
     
     
    class MeP_Function(object):
        "Methodes simples liees a l'interface"
        def __init__(self): #__init__(self,truc):
            object.__init__(self)
            self.attribut1 = "attribut1 ok"
            #self.machin = truc
     
        def base (self):
            self.machin.pb_Validemodele.setText("ma fonction est bonne")
            return self.attribut1+"Yopiyo"
     
        def base2 (self, bouton):
            bouton.setText("Hahaha")
    Si des aberrations vous apparaissent n'hésitez pas à le signaler, pour l'instant mon code à l'air de fonctionner alors encore merci !

  9. #9
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    je n'aurais personnellement pas eu recours à l'héritage multiple. De ce que je comprends, MeP_Form est un QDialog et donc l'héritage s'impose. Par contre il ne m'apparait pas évident que MeP_Form est un MeP_Function mais plutôt qu'il l'utilise.

    je serais donc plutôt parti vers un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MeP_Form(QDialog):
        def __init__(self,meP_Function):
            QDialog.__init__(self)
            self.meP_Function = meP_Function #meP_Function est une instance de MeP_Function
    mais c'est peut être du à une mauvaise compréhension de ce qu'est une MeP_Function.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Par défaut
    Effectivement c'est plus ca :

    Par contre il ne m'apparait pas évident que MeP_Form est un MeP_Function mais plutôt qu'il l'utilise.
    Mon problème c'est en fait de disposer le plus simplement possible des variables attribuées aux objets Qt de l'interface dans ma classe MeP_Function qui regroupe les fonctions, car mes fonctions les utilisent. Mais à part les passer en argument je ne sais pas comment faire.... enfin s'il y a quelque-chose de plus pratique que ca ...

Discussions similaires

  1. [MFC] objet commun a plusieurs classes
    Par Info42 dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2006, 19h52
  2. Heritage de plusieur classes
    Par JiJiJaco dans le forum Langage
    Réponses: 10
    Dernier message: 26/12/2005, 20h12
  3. [css] plusieurs classes appellées? comment ça marche
    Par luta dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 09/11/2005, 01h20
  4. Utilisation de variables dans plusieurs classes
    Par dedeloux dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2005, 18h25
  5. [Servlet] Utilisation de plusieurs classes
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/05/2005, 10h43

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