Boucle if défectueuse
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)
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.
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