Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Méfie à ==None !!!

19 réponses
Avatar
Méta-MCI \(MVP\)
Bonjour !

Bien qu'ayant fait le ménage il y a un certain temps, il restait, dans
de vieilles routines, quelques ... == None (ou ... != None).

Avec Python 2.5, ça passait encore.
Avec Python 2.6 (et certainement avec 3), ça accroche beaucoup plus
souvent. Mais pas toujours...
Pensez à bien utiliser is None

@-salutations
--
Mlichel Claveau

9 réponses

1 2
Avatar
Encolpe Degoute
NicolasP a écrit :
Encolpe Degoute a écrit :

D'un point de vue sémantique '==' est fait pour comparer des valeurs
et 'is' pour comparer des références sur les objets.


C'est bien de le rappeler.

'None' n'est pas une valeur mais une absence de valeur.


On peut aussi dire que None est un objet qui représente une absence de
valeur. Non ?



Oui.
C'est une référence en mémoire qui représente une absence de valeur ce
qui permet de pouvoir utiliser 'is'.

Utiliser '==' pour comparer deux absences de valeurs n'a pas de sens
par contre vérifier qu'un objet utilise bien la référence vers
l'absence de valeur est sémantiquement correct.



Si mon affirmation ci-dessus est vraie, alors il n'y a pas de raison de
ne pas pouvoir utiliser '=='.



Tu peux l'utiliser mais les comparaisons entre types sont limitées aux
transtypages et à l'implémentation de la méthode __cmp__... avec des
comportements aléatoires entre versions de python.
De la même manière certains objets sont 'callable' et peuvent renvoyer
'None' même lorsqu'ils contiennent des valeurs.


J'ai bien le droit de comparer un entier et un flottant, des objets qui
ne sont pas du même type.



Comme expliqué ci-dessous c'est possible mais il vaut mieux contrôler à
la source.

le code dans le style de 'toto == None' est de la même qualité qu'un
except sans type d'erreur spécifier. Autant faire du PHP.


--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales
Avatar
NicolasP
Daireaux Jean-Baptiste a écrit :
NicolasP a écrit :
Encolpe Degoute a écrit :
NicolasP a écrit :





[[CUT]]
J'ai bien le droit de comparer un entier et un flottant, des objets
qui ne sont pas du même type.

Nicolas



Non tu n'a pas le droit de comparer un entier et un flottant, t'a
toujours un trans-typage de caché dans l'opération (en l'occurrence
transformation de l'entier en flottant) avant la comparaison.



Bien sûr qu'il y a du transtypage. Et je compte sur le language pour les transtypages de base.

Nicolas
Avatar
NicolasP
Encolpe Degoute a écrit :
NicolasP a écrit :
Encolpe Degoute a écrit :

D'un point de vue sémantique '==' est fait pour comparer des valeurs
et 'is' pour comparer des références sur les objets.


C'est bien de le rappeler.

'None' n'est pas une valeur mais une absence de valeur.


On peut aussi dire que None est un objet qui représente une absence de
valeur. Non ?



Oui.
C'est une référence en mémoire qui représente une absence de valeur ce
qui permet de pouvoir utiliser 'is'.

Utiliser '==' pour comparer deux absences de valeurs n'a pas de sens
par contre vérifier qu'un objet utilise bien la référence vers
l'absence de valeur est sémantiquement correct.


Si mon affirmation ci-dessus est vraie, alors il n'y a pas de raison de
ne pas pouvoir utiliser '=='.



Tu peux l'utiliser mais les comparaisons entre types sont limitées aux
transtypages et à l'implémentation de la méthode __cmp__... avec des
comportements aléatoires entre versions de python.


Je pensais que le language gère correctement les transtypages de base.

De la même manière certains objets sont 'callable' et peuvent renvoyer
'None' même lorsqu'ils contiennent des valeurs.


Tout à fait. Mais dans ce cas, c'est le résultat renvoyé par l'objet que l'on compare, pas l'objet lui même.


J'ai bien le droit de comparer un entier et un flottant, des objets qui
ne sont pas du même type.



Comme expliqué ci-dessous c'est possible mais il vaut mieux contrôler à
la source.

le code dans le style de 'toto == None' est de la même qualité qu'un
except sans type d'erreur spécifier.


Ca, j'ai bien compris.
Je ne discute pas le fait qu'il faille utiliser 'is None' au lieu de '== None'.
Les raisons données par tous les intervenants sont claires et sans appel.
De plus, si le langage dit que ça doit être comme ça, ça ne se discute même pas.
j'essaie seulement de montrer que ce n'est pas si évident que certains le disent.

Autant faire du PHP.
Oulala quelle horreur. Je vais vite enlever tous les '==' de mes sources ;)
Avatar
Antoine Pitrou
On Thu, 05 Feb 2009 12:03:06 +0100, Méta-MCI (MVP) wrote:

Bien qu'ayant fait le ménage il y a un certain temps, il restait, dans
de vieilles routines, quelques ... == None (ou ... != None).

Avec Python 2.5, ça passait encore.
Avec Python 2.6 (et certainement avec 3), ça accroche beaucoup plus
souvent. Mais pas toujours...



Je ne sais pas de quel genre de cas tu parles mais tu peux rapporter un
bug sur http://bugs.python.org, histoire d'être sûr.

a+

Antoine.
Avatar
Amaury Forgeot d'Arc
> Antoine.



Tiens, un nouveau ;-)

--
Amaury Forgeot d'Arc
Avatar
Michel Claveau - NoSpam SVP ; merci
Bonjour !

tu peux rapporter un bug



Bug ? Quel bug ?
Le seul bug que j'ai trouvé concerne Pywin32. J'en ai discuté avec Mark
Hammond, qui l'avais également trouvé (deux jours avant moi). La
correction est faite, et sera inclue dans la prochaine publication de
Pywin.
Mais, ce n'est pas générique à Python.

@+
--
Michel Claveau
Avatar
Michel Claveau - NoSpam SVP ; merci
Salut !

Si mon affirmation ci-dessus est vraie, alors il n'y a pas de raison
de ne pas pouvoir utiliser '=='. J'ai bien le droit de comparer un
entier et un flottant, des objets qui ne sont pas du même type.



Je suis d'accord. Du moment que l'on sait ce que l'on fait, et notamment
si on réalise qu'il y aura utilisation du transtypage, rien n'interdit
de comparer à None (avec == ou !=)
Maintenant, comme tu l'as fait remarquer ailleurs, ce n'est pas parce
qu'on a le droit, qu'il faut en abuser.

@+

MCI
Avatar
Antoine Pitrou
On Wed, 11 Feb 2009 10:56:42 +0100, Michel Claveau - NoSpam SVP ; merci
wrote:

Bug ? Quel bug ?



Si quelque chose ne marche plus avec la 2.6 (i.e. "bidule == None") alors
que ce n'est pas renseigné dans les changements officiels de la 2.6,
c'est un bug.

a+

Antoine.
Avatar
Antoine Pitrou
On Tue, 10 Feb 2009 23:43:35 +0100, Amaury Forgeot d'Arc wrote:

Antoine.



Tiens, un nouveau ;-)



Je ne fais que passer :)
1 2