Boucle if défectueuse

Fermé
Joseph_Hocquet Messages postés 17 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 28 août 2022 - 28 août 2022 à 17:33
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 - 29 août 2022 à 15:24

Bonjour,

Voici un petit bout de programme :

v=check(ind[i][0],[z[0]+b[0],z[1]+b[1]])
if v==False :
   print(v)

Souvent, ça renvoie correctement False mais des fois ça renvoie autre chose.

Check est une fonction qui renvoie False ou un nombre. Il n'y a pas d'erreur de ce côté là.

Cela veut dire que même quand v n'est pas False, il passe le if.

J'ai modifié le if en if v==False and v==False : L'erreur se produit plus rarement mais est toujours là...

Merci d'avance


Windows / Firefox 103.0

3 réponses

Whismeril Messages postés 19043 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 mai 2024 912
Modifié le 28 août 2022 à 18:38

Bonjour

étonnant, n'aurais-tu pas appelé une variable False?

On peut utiliser à peu près n'importe quoi comme nom de variable en Python, cela dit mon IDE refuse False, ce n'est peut-être pas possible, mais au cas où.

Sinon, peux-tu tester comme ça pour voir s'il se passe un autre truc chelou

v=check(ind[i][0],[z[0]+b[0],z[1]+b[1]])
print('avant le if v : ', v)
if v==False:
   print('dans le if v : ', v)

0

Bonjour, la seule raison probable est que ta fonction renvoie parfois 0, et en ptyhon 0 == False, 1 == True,  les booléens en python sont des entiers « déguisés ».

 Ce n'est de toute façon pas très cohérent de renvoyer soit un booléen, soit un entier, une fonction doit renvoyer toujours le même type de valeur, sinon, bah on a des problèmes de ce type.

0
yg_be Messages postés 22793 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 mai 2024 1 467
29 août 2022 à 13:52

bonjour,

plus propre:

def check():
    return False,23
v,n=check()
if not v:
    print("faux",n)
else:
    print("vrai",n)
0
yg_be Messages postés 22793 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 mai 2024 1 467
29 août 2022 à 13:54

Dans presque tous les langages, n'importe quelle valeur différente de zéro est "vraie".

0
Whismeril Messages postés 19043 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 mai 2024 912 > yg_be Messages postés 22793 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 mai 2024
29 août 2022 à 14:18

Quand j'ai lu

mais des fois ça renvoie autre chose

j'ai interprété qu'il y a toute sorte de valeurs, mais effectivement si ça n'arrive qu'avec les 0 c'est évidemment ça le problème. 

0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
Modifié le 29 août 2022 à 15:30

Bonjour,

Il faudrait voir un exemple de code minimal qui reproduit le bug mais ce qui est sûr c'est que le design de la fonction laisse à désirer.

  • C'est généralement une mauvaise idée d'avoir une fonction dont le type de retour dépend des conditions. 
  • Si ta fonction doit retourner une valeur particulière car quelque chose d'anormal s'est passé, tu devrais soit lever une exception, soit retourner None, car False vaut en réalité 0, et donc tu ne peux pas distinguer le cas où ta fonction retourne False et le cas où ta fonction retourne 0.
  • Si tu décides de retourner None, le test devient :
v = check()
if v is None:
   print("Oops")
else:
   # Suite du programme
  • Si ta fonction lève une exception, le test devient :
try:
   v = check()
   # Suite du programme
except Exception as e:
   print("Oops")
  • Attention, les tests if v is None et if not v ne sont pas équivalents.
    • if v is None est déclenché si et seulement si v vaut None,
    • if not v est déclenché si et seulement si v vaut None, 0, ou False.

Bonne chance

0