2009-05-15 6 views
1

Au plus profond de mon code, dans un imbriqué si à l'intérieur d'un imbriqué dans une méthode de classe, je compare une certaine valeur d'index à la longueur d'une certaine liste, pour valider je peux accéder à cet index. Le code ressemble à quelque chose comme ça:Comparaison de nombres - Bug Python?

if t.index_value < len(work_list): 
    ... do stuff ... 
else: 
    ... print some error ... 

Pour plus de précisions, index_value est au moins zéro (validé ailleurs). À ma grande surprise, même si je sais que les données index_value sont valides, le code continue d'aller à la clause "else:". Je glissai ad hoc code de débogage:

print('Checking whether '+str(t.index_value)+"<"+str(len(work_list))) 

x = t.index_value 
y = len(work_list) 

print(x) 
print(y) 
print(x<y) 

if t.index_value < len(work_list): 
    ... do stuff ... 
else: 
    ... print some error ... 

Voici le résultat:

>> Checking whether 3<4 
>> 3 
>> 4 
>> False 

Quelqu'un peut-il me aider à comprendre ce qui se passe ici?

D'autres précisions:

  • work_list est une variable locale instancié dans la méthode
  • t est une instance de classe, instancié dans la méthode (t = SomeClass())

Mise à jour: La problème était que le type de t.index_value était UNICODE et non int. La raison en est que j'ai désérialisé le contenu de t d'un fichier texte, où la valeur de index_value est représentée par un caractère à un chiffre. Après l'avoir extrait du texte, je l'ai immédiatement assigné à index_value, sans passer par int() ce que j'aurais dû faire, et cela a résolu le problème.

J'ai décidé de garder le titre "controversé" malgré le fait que ce soit clairement mon bug et pas celui de Python, car les gens avec le même problème peuvent le trouver en utilisant ce titre.

+0

Pourriez-vous ajouter une ligne sous votre première déclaration d'impression? Essayez print (tapez (t.index_value)) – Wesley

Répondre

8

D'après mon expérience, quel est le type de "t.index_value"? Peut-être que c'est une chaîne "3".

>>> print '3' < 4 
False 
+0

C'était le problème, merci –

2

Pour afficher des valeurs qui pourraient être de différents types que vous attendez (par exemple une chaîne plutôt que plusieurs, comme KCWU suggère), utiliser repr(x) et autres.