Boucle if défectueuse

Joseph_Hocquet Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -

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

Utilisateur anonyme
 

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
regglyss
 

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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

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

0
Utilisateur anonyme > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

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 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 

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