not is versus != en 2.6

Le
Michel Claveau - NoSpam SVP ; merci
Bonjour !

J'aurais besoin d'un petit éclaircissement.
J'ai un script qui contenait cette ligne :
if i1 != i2:
i1 et i2 étant des instances d'une même classe, ou de deux classes
différentes.
Sous Python 2.5, cela fonctionnait bien.
Sous Python 2.6.1, si les instances sont de la même classe, c'est bon.
Mais, si les instances sont de deux classes différentes, j'ai une erreur
de types.
Le message exact :
File "C:Ponxpluiepluie.py", line 293, in __init__
if form.conteneurcourant != containeur:
File "C:Python26libsite-packageswin32comclientdynamic.py",
line 205, in __cmp__
return cmp(self._oleobj_, other)
TypeError: The Python instance can not be converted to a type object

Pour régler le problème, j'ai pu modifier mon code, de façon à utiliser
not (.. is ..) à la place de !=
Cela fonctionne.
Mais, je me demande si is est bien adapté à comparer des instances
différentes, pouvant avoir des valeurs identiques.

À vous lire

--
Michel Claveau
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christophe
Le #18577671
Michel Claveau - NoSpam SVP ; merci a écrit :
Bonjour !

J'aurais besoin d'un petit éclaircissement.
J'ai un script qui contenait cette ligne :
if i1 != i2:
i1 et i2 étant des instances d'une même classe, ou de deux classes
différentes.
Sous Python 2.5, cela fonctionnait bien.
Sous Python 2.6.1, si les instances sont de la même classe, c'est bon.
Mais, si les instances sont de deux classes différentes, j'ai une erreur
de types.
Le message exact :
File "C:Ponxpluiepluie.py", line 293, in __init__
if form.conteneurcourant != containeur:
File "C:Python26libsite-packageswin32comclientdynamic.py", line
205, in __cmp__
return cmp(self._oleobj_, other)
TypeError: The Python instance can not be converted to a type object

Pour régler le problème, j'ai pu modifier mon code, de façon à utiliser
not (.. is ..) à la place de ! > Cela fonctionne.
Mais, je me demande si is est bien adapté à comparer des instances
différentes, pouvant avoir des valeurs identiques.

À vous lire...




Etrange, il me semblait que c'était seulement dans Python 3000 où ils
allaient interdire formellement les comparaisons entres objets de
différents types. Et il me semblait que seul les comparaisons
d'ordonnancement ( < > <= >= ) allaient être affectées.

De toute façon, is est clairement inadapté à comparer des instances
différents ayant des valeurs identiques car l'opérateur is est
exactement équivalent à une comparaison de pointeurs mémoire ou du
résultat de la fonction id()
Alain Ketterlin
Le #18577771
"Michel Claveau - NoSpam SVP ; merci"
J'ai un script qui contenait cette ligne :
if i1 != i2:
i1 et i2 étant des instances d'une même classe, ou de deux classes
différentes.



Si les classes sont différentes, la comparaison devrait avoir pour
résultat False, sauf si celle de i1 définit __cmp__

Mais, si les instances sont de deux classes différentes, j'ai une
erreur de types.
Le message exact :
File "C:Ponxpluiepluie.py", line 293, in __init__
if form.conteneurcourant != containeur:
File "C:Python26libsite-packageswin32comclientdynamic.py",
line 205, in __cmp__
return cmp(self._oleobj_, other)
TypeError: The Python instance can not be converted to a type object



C'est donc la définition de __cmp__ mentionnée qui est responsable ici.

Pour régler le problème, j'ai pu modifier mon code, de façon à
utiliser not (.. is ..) à la place de ! > Cela fonctionne.



"is" teste si il s'agit du même objet (donc le test est évidemment
faux si il s'agit de deux instances de classes différentes).

Mais, je me demande si is est bien adapté à comparer des instances
différentes, pouvant avoir des valeurs identiques.



A priori non, il te faut dans ce cas redéfinir __cmp__ (ou __eq__ ou
__ne__), probablement dans les deux classes.

En tout cas c'est comme cela que je lis la réf. du langage (aux
sections "Expressions" / "Comparisons" et "Special method Names" pour
__cmp__)...

-- Alain.
Michel Claveau - NoSpam SVP ; merci
Le #18585971
Re !

Merci pour vos réponses.

Après contact avec Mark Hammond, il s'avère qu'il y a bien un bug. Il
était déjà tombé dessus, a effectué une correction, mais préfère
attendre le prochain "build" normal de Pywin32 et de sa python26.dll
(pas gênant, vu qu'il existe une solution temporaire).

Voici un extrait de son message :
It was related to the new rich-comparison work for py3k.



@-salutations
--
Michel Claveau
Publicité
Poster une réponse
Anonyme