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 :

Comportement curieux de __div__ sous Python 3.4


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 41
    Points : 34
    Points
    34
    Par défaut Comportement curieux de __div__ sous Python 3.4
    Bonjour,
    Je fais de la programmation objet en Python. J'ai des classes pour lesquelles je dois surcharger les opérateurs arithmétiques.

    Tous marchent sauf la division.

    Voici un exemple de codes:
    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
     
    class A (object):
    	def __init__(self, n ='test'):
    		self.name = n
     
     
     
     
    class B(A):
    	def __init__(self, n ='test', val = 0):
    		super (B, self).__init__(n)
    		self.value = val
     
    	def __add__(self, val_to_add):
    		if( (isinstance (val_to_add, C)) or isinstance(val_to_add, B) ):
    			return ( self.value + val_to_add.value)
    		elif( (isinstance(val_to_add, float)) or isinstance(val_to_add, int)):
    			return (self.value + val_to_add)
     
    	def __sub__(self, val_to_add):
    		if( (isinstance (val_to_add, C)) or isinstance(val_to_add, B) ):
    			return ( self.value - val_to_add.value)
    		elif( (isinstance(val_to_add, float)) or isinstance(val_to_add, int)):
    			return (self.value - val_to_add)
     
    	def __div__(self, val_to_add):
    		if( (isinstance (val_to_add, C)) or isinstance(val_to_add, B) ):
    			return ( self.value / val_to_add.value)
    		elif( (isinstance(val_to_add, float)) or isinstance(val_to_add, int)):
    			return (self.value / val_to_add)
     
     
    class C(B):
    	def __init__(self, n ='test', val = 0, l = []):
    		super (C, self).__init__(n, val)
    		self.liste = l
     
    	def __add__(self, val_to_add):
    		return (super (C, self).__add__(val_to_add))
     
    	def __sub__(self, val_to_sub):
    		return (super (C, self).__sub__(val_to_sub))
     
    	def __div__(self, val_to_div):
    		return (super (C, self).__sub__(val_to_div))
     
     
    b = B ("toi", 0)
    c= C ("t", 3)
     
    print ("b / c", b/c)
    Sous Python 2.7 ,j'ai comme resultat 0. Ce qui est normal.

    Mais sous Python 3.4 j'ai l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "biza.py", line 51, in <module>
        print ("b / c", b/c)
    TypeError: unsupported operand type(s) for /: 'B' and 'C'
    La ligne en question est celle de l'instruction print .

    Par contre sous Python 3.4 marche.

    Quelqu'un pourrait-il me dire ce qui se passe? Je n'y comprends rien.

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par dimele Voir le message
    Quelqu'un pourrait-il me dire ce qui se passe? Je n'y comprends rien.
    Si on a écrit une Python3, c'est pour pouvoir changer certaines choses.
    Signaler un "changement de version": c'est dire qu'un truc qui fonctionnait en 2.x ne passera plus en 3.x.
    Au programmeur de se mettre à la page!

    Utilisez __truediv__:__div__ a disparu.
    Pour les explications, relire le PEP 238 (çà date de Python 2.2...)

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    J'ai regardé et la méthode __div__ existe toujours si j'ai bonne mémoire.

    Merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par dimele Voir le message
    J'ai regardé et la méthode __div__ existe toujours si j'ai bonne mémoire.
    Et bien regardez encore.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dimele Voir le message
    J'ai regardé et la méthode __div__ existe toujours si j'ai bonne mémoire.

    Merci
    Bonjour Bienvenu,

    Vous trouverez d'intéressantes informations à cet endroit : https://docs.python.org/3.4/referenc...-numeric-types

    Bonne journée.

    @+.

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Il suffit de vérifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> for method in dir(int):
    ...     if method.startswith('__d'):
    ...         print(method)
    ... 
    __delattr__
    __dir__
    __divmod__
    __doc__
    On se rend compte que la méthode __div__ n'existe plus.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    "constater" qu'il n'y est plus ne dit pas si c'est un "bug" ou si c'est "délibéré".
    __div__ était mentionné dans la documentation des premières versions de Python3.
    Il y a eu des bug-reports contre la documentation et çà a été corrigé depuis.

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

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

Discussions similaires

  1. [2008R2] sql server : requête sous python comporte la division entre deux attributs
    Par noramokh dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/06/2014, 16h24
  2. Midi sous Python
    Par pfeuh dans le forum Général Python
    Réponses: 1
    Dernier message: 14/11/2006, 11h45
  3. comportement curieux font-bold sous ffx ?
    Par SpaceFrog dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 22/06/2006, 11h51
  4. Fonction addslashes sous Python ?
    Par ecocentric dans le forum Général Python
    Réponses: 2
    Dernier message: 28/01/2006, 18h27
  5. Existe-t-il un rad sous python?
    Par sloshy dans le forum EDI/RAD
    Réponses: 6
    Dernier message: 03/10/2005, 09h26

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