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 :

Peut-on surcharger None ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut Peut-on surcharger None ?
    Bonjour,

    pour satisfaire mon désir d'élégance minimaliste j'aimerais pouvoir ne pas tester la "Nonitude" d'un objet avant d'appeler une de ses méthode...

    Je m'explique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def SpamAndEggs ( obj = None ):
        '''obj peut être None'''
        if obj: # -> il faut le tester avant d'appeler sa méthode
            obj.add_salt( 5 )
     
    class SaltAdder :
        def add_salt ( self,x ):
            print "yummy with some more salt"
     
    yum = SaltAdder()
    SpamAndEggs()
    SpamAndEggs( yum )
    Si obj vaut None, je veux que qu'il ne se passe rien...
    Mais, cela m'oblige à tester obj.
    J'aimerai pouvoir définir un comportement par defaut de None tel que si j'invoque une méthode de None, au lieu de lever une exception, il ne se passe rien. (bien sûr, hors de question de faire des try/except !)

    Un truc dans ce genre :
    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
    class NoneType:
        def add_salt ( self,x ):
            pass # None.add_salt ne fait rien
     
    def SpamAndEggs ( obj = None ):
        '''obj peut être None'''
        obj.add_salt( 5 ) # pas besoin de test !
     
    class SaltAdder :
        def add_salt ( self,x ):
            print "yummy with some more salt"
     
    yum = SaltAdder()
    SpamAndEggs()
    SpamAndEggs( yum )
    On surcharge la classe NoneType pour lui ajouter la méthode add_salt et le tour est joué...
    ben non ! ça ne marche pas.
    Je pense que le problème vient de ce que l'objet None est instancié au début du monde et qu'il ne profite pas des ajouts faits à la classe NoneType.

    Donc, cher Pythoniste, si tu as une idée pour faire marcher mon truc, je suis preneur !

    Hadrien

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Ben en fait c'est vraiment très simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def SpamAndEggs ( obj = None ):
        '''obj peut être None'''
        if obj is not None: # -> il faut le tester avant d'appeler sa méthode
            obj.add_salt( 5 )
     
    class SaltAdder :
        def add_salt ( self,x ):
            print "yummy with some more salt"
     
    yum = SaltAdder()
    SpamAndEggs()
    SpamAndEggs( yum )
    if suffit de rajouter "is not None"(ou "!=None") au moment de tester obj, ou mieux encore, demander si obj est une instance de SaltAdder, auquel cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def SpamAndEggs ( obj = None ):
        '''obj peut être None'''
        if isinstance(obj, SaltAdder): # -> il faut le tester avant d'appeler sa méthode
            obj.add_salt( 5 )
     
    class SaltAdder :
        def add_salt ( self,x ):
            print "yummy with some more salt"
     
    yum = SaltAdder()
    SpamAndEggs()
    SpamAndEggs( yum )
    sera plus approprié

    EDIT: ou bien utiliser un décorator:
    http://www.developpez.net/forums/d685735/autres-langages/python-zope/general-python/decorateurs-quoi-sert/#post4006662
    ou encore remplacer "None" par "SaltAdder()" comme valeur par défaut de obj

  3. #3
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    euh... j'ai peur de ne pas m'être bien fait comprendre...
    if suffit de rajouter "is not None"(ou "!=None") au moment de tester obj
    ce que je veux c'est ne pas tester justement.

    Si j'appelle obj.add_salt alors que obj vaut None, je veux que l'appel soit "détourné" vers quel que chose d'autre.

    Dans la solution que j'avais imaginée (mais qui ne marche pas), cette autre chose était la méthode add_salt que j'avais ajoutée à NoneType.

    Hadrien

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Par défaut
    Je ne sais pas trop si on peut faire ce que tu cherches a faire. Mais d'un point de vue strictement personnel, je trouve ca vraiment limite, ce a quoi tu veux arriver.

    Tu autorises explicitement une valeur par défaut à ta méthode, mais tu veux masquer le traitement qui est relatif à ce cas... Qui plus est tu le masque d'une façon très anti-conventionnel...
    Mis à part pour la beauté de savoir si c'est possible, sinon je n'y vois absolument aucun intérêt. Voir pire, je suis intimement persuadé que ce n'est pas une chose a faire. Imagines que tu reviennes voir ton code plusieurs mois après l'écriture, il n'y a presque aucune chance que tu comprennes le comportement sans relire en détail tout le code.

    Si vraiment tu veux éliminer ce test, ne propose pas de valeur par défaut à None. Comme ca, pas de soucis.

    Ne prend pas mal ce que je viens de dire, hein ^^ C'est juste un avis personnel. Ca vient du fait que j'ai fais du support de code pendant des années et je peux te dire que tomber sur un truc pareil ca fait dresser les cheveux sur la tête

  5. #5
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    obj est un paramètre pouvant être de n'importe quel type, si on ne le teste pas , comment savoir que obj est bien du type voulu ? Grâce à un decorator on peut éventuellement reporter le test dans ce dernier, mais se passer complètement du test... c'est possible, mais dès lors je rejoins ce que dit Shadowsman : tu pourrais perdre pas mal de temps lors d'une éventuelle future relecture à retracer le cheminement désiré de l'information...

    Si j'appelle obj.add_salt alors que obj vaut None, je veux que l'appel soit "détourné" vers quel que chose d'autre.
    Mais même dans ce cas, ce n'est que déporter le test ailleurs....

  6. #6
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Bon ok, vous m'avez convaincu que c'est mal.

    En fait, j'ai trouvé une solution plus propre et plus lisible :

    Déclarer un Default_SaltAdder comme valeur par defaut au paramètre obj Default_SaltAdder a méthode add_salt qui ne fait rien.

    Mais quand même s'il y une solution avec None, je suis curieur de la connaître, juste pour ma culture pythonesque.

    Hadrien

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

Discussions similaires

  1. Peut-on surcharger un serveur avec Curl ?
    Par Maki69 dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2013, 00h55
  2. Réponses: 4
    Dernier message: 30/09/2012, 08h50
  3. Réponses: 8
    Dernier message: 20/11/2002, 11h50
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 10h46
  5. Un Sender peut-il s'auto-détruire lors d'un onClick?
    Par Flo. dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/07/2002, 10h31

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