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 33475 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 janvier 2025 - 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

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 23435 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 janvier 2025 1 559
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 23435 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 janvier 2025 1 559
29 août 2022 à 13:54

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

0
Utilisateur anonyme > yg_be Messages postés 23435 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 janvier 2025
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 33475 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 janvier 2025 7 815
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