Sujet : Re: Comportement étrange avec IN et OR...
De : alain (at) *nospam* universite-de-strasbourg.fr.invalid (Alain Ketterlin)
Groupes : fr.comp.lang.pythonDate : 26. May 2022, 10:27:00
Autres entêtes
Organisation : Université de Strasbourg
Message-ID : <87ilpsy78b.fsf@universite-de-strasbourg.fr.invalid>
References : 1
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
Dominique <
zzz@aol.com.invalid> writes:
test='[22118.286892] i915 0000:00:02.0: [drm] *ERROR* AUX C/DDI C
(TC)/PHY TC1: did not complete or timeout within 10ms (status
0xad4003ff)'
test2=list(test.split(' '))
'*ERROR*' or 'ERR' in test2
Cela ne signifie pas ce que tu crois. Cette expression est interprétée
comme :
- est-ce que « '*ERROR*' » est vraie ?
- sinon, est-ce que « 'ERR' in test2 » est vraie ?
Techniquement c'est
('*ERROR*') or ('ERR' in test2)
L'opérande de gauche ne mentionne même pas test2.
La première condition ('*ERROR*') est toujours vérifiée (parce qu'une
chaîne de caractères est considérée comme vraie dès qu'elle n'est pas
vide). D'autre part "x or y" a la valeur de x si x est vraie, et sinon
la valeur de y : en clair, une valeur brute (comme '*ERROR*') est
convertie en booléen pour tester sa véracité, mais l'expression garde la
valeur non convertie.
(Au passage, c'est une illustration de l'aversion de python pour le
typage. Par exemple le résultat de
x or "Damned"
où x est un entier, sera soit un entier (si x != 0) soit une chaine de
caractères. Pure perversité.)
Bref : ce que tu veux (probablement) est
'*ERROR*' in test2 or 'ERR' in test2
Il faut faire deux tests "in", on ne peut pas tester deux valeurs en
même temps avec "in" : ce qui est à gauche de "in" doit être une chaîne
(dans ton cas). Si tu écris :
('*ERROR*' or 'ERR') in test2
le "or" est calculé d'abord, et tu testes en substance « '*ERROR*' in
test2 ».
-- Alain.