Invalid literal for int() with base 10: '-0.5'

Fermé
Quelquundebien - Modifié le 8 avril 2022 à 18:39
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 - 25 avril 2022 à 13:05
Salut,

Je suis un tutoriel pour faire un jeu en python de GRAVEN : https://www.youtube.com/watch?v=ooITOxbYVTo

Mais à partir de la moitié du tutoriel, sans aucune raison apparente, on me renvoie une erreur que je n'arrive pas à comprendre :

  File "C:\Users\MOI\Documents\PythonPro\lib\site-packages\pytmx\pytmx.py", line 357, in _cast_and_set_attributes_from_node_items
casted_value = types[key](value)
ValueError: invalid literal for int() with base 10: '-0.5'


L'erreur viendrait donc de la bibliothèque PYTMX, or je n'ai pas touché au fichier.

Quelqu'un peut me dire comment résoudre ce problème ?
A voir également:

8 réponses

Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024 931
4 avril 2022 à 21:50
Bonjour

Dans ma boule de cristal, je vois qu'il manque une pinte à la ligne 1664.

Ha tu voulais une réponse sérieuse, ben il faut poser une question sérieuse...
A commencer par le code qui plante, l’indentation est primordiale, or par défaut le site ne la conserve pas.
Pour la conserver il faut utiliser les balises de code. Voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
On pourra commencer à essayer de t’aider quand tu auras posté correctement ton code.

Ensuite, concernant les tutos vidéos, lire ceci https://forums.commentcamarche.net/forum/affich-36859630-cours-sur-le-c#10

0
 File "C:\Users\Documents\PythonPro\lib\site-packages\pytmx\pytmx.py", line 357, in _cast_and_set_attributes_from_node_items
    casted_value = types[key](value)
ValueError: invalid literal for int() with base 10: '-0.5

'

Je précise que je n'ai évidemment pas touché ce fichier, et que l'erreur est apparu après avoir posé des collisions avec TILED. Mais je suis pas sûre que il y ai un lien.

Merci, je savais pas comment faire. Et pour le tuto ne t'inquiète pas je sais faire la différence entre un bon tuto et un tuto nul.

Tu peut m'aider ?
0
Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024 931
5 avril 2022 à 11:39
Tu peut m'aider ?


Peut-être mais il faut commencer par poster le code qui plante.
Le message d’erreur c’est une information importante mais ça ne suffit pas
0
georges97 Messages postés 11847 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 30 avril 2024 2 254
5 avril 2022 à 11:52
Bonjour Whismeril,

Suite à un doublon, je m'étais permis ce matin d'essayer de préciser à quelqundebien? quiil réponde à ta demande sur le fil initial.

https://forums.commentcamarche.net/forum/affich-37564951-erreur-de-pytmx

Mais il semble qu'il persiste à demander une solution presse-bouton, assez improbable en programmation.

Je ne doute pas qu'il réfléchisse à s'inscrire dans le bon fonctionnement d'un forum.

Cordialement
0
Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024 931 > georges97 Messages postés 11847 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 30 avril 2024
5 avril 2022 à 12:54
Salut Georges.
C’est sûr que s’il espère quelqu’un va se fader 1h00 de vidéo pour ses beaux yeux, il est mal barré.

Quoiqu’il en soit, pas de code pas de résolution possible.
0
Quelquundebien > Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024
Modifié le 5 avril 2022 à 13:14
Et je ne vous ai pas demandé de regarder la vidéo, j'ai mis le lien pour créditer l'auteur du tuto et pour prouver qu'il ne s'agit pas, comme tu le dit dans ton avertissement, d'un enfant de 12 ans.
Je voulais savoir si le problème venait de la bibliothèque ou de chez moi. Mais tant pis, je vais demander ailleurs, et je mettrai la solution si je la trouve.
0
Quelquundebien
5 avril 2022 à 13:10
Le problème est que le code en question fait 1500 lignes, puisqu'il s'agit de la bibliothèque PYTMX, et je ne suis pas sûre que mettre autant de ligne soit autorisé, ou même pertinent.
Serait-il possible que tu importe chez toi PYTMX ? Le code sera le même.

Quand à mon code personnel, j'ai vérifier sur un autre de mes programmes et ça me fait la même erreur, donc mon code n'as normalement rien à voir avec l'erreur.
0
Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024 931
5 avril 2022 à 13:32
Je ne te demande pas le code entier, mais le bloc qui plante.

Quand à mon code personnel, j'ai vérifier sur un autre de mes programmes et ça me fait la même erreur, donc mon code n'as normalement rien à voir avec l'erreur.

Sauf si dans les 2 cas tu l’as mal utilisé
0
Quelquundebien
5 avril 2022 à 14:07
    def _cast_and_set_attributes_from_node_items(self, items):
        for key, value in items:
            casted_value = types[key](value)
            setattr(self, key, casted_value)



J'ai regardé et il semble que l'erreur vienne de là.
0
Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024 931
5 avril 2022 à 16:43
Ok quel est le contenu de items?
Si tu ne sais pas, fait un print(items) juste avant le for et copie colle le résultat
0
Après avoir fouillé un peu j'ai trouvé ça :

[('id', '4'), ('name', 'path'), ('width', '50'), ('height', '50')]
[('id', '5'), ('name', 'Objects'), ('offsetx', '0'), ('offsety', '-0.5')] 
# Valeur de ITEMS
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024 931
5 avril 2022 à 17:49
La même erreur à la même ligne?
0
Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024 931
5 avril 2022 à 18:18
OK. Donc ça plante là oui, mais le problème vient « d’avant »

A priori cette fonction fait partie d’une classe.
Elle permet d’affecter des attributs de la classe à partir d’un dictionnaire (items).
Cette classe possède un attribut qui s’appelle offsety qui normalement est un int, et dans le dictionnaire il y a
 '-0.5' 

Le problème étant que cette valeur n’est pas un nombre mais du texte.
Une conversion décimale -> entier ne devrait pas créer de plantage, un mauvais résultat peut-être.
Mais avec le texte, la fonction appelée « derrière » (sans doute dans settattr) est une conversion de texte vers int et là c’est pas possible.

Il faut donc que tu trouves le code qui appelle la fonction _cast_and_set_attributes_from_node_items et voir si le dictionnaire y est créé ou rempli.
Et si oui trouver pourquoi il y a cette mauvaise valeur.
Et si ça vient d’encore avant, il faut remonter jusqu’à « la source ».

Si ton IDE permet de mettre des points d’arrêt et d’avancer pas à pas, tu peux aussi dans un premier temps essayer de cibler un « moment » d’exécution clé et avancer en pas à pas jusqu’à trouver le moment où cette valeur est assignée.
0
Quelquundebien
5 avril 2022 à 20:21
C'est bon !
De ce que tu m'as dit, la value de la clé 'offsety' devrait être un float et non un str.
Au lieu de fouiller partout, j'ai modifié moi-même la value :

    def _cast_and_set_attributes_from_node_items(self, items):
        for key, value in items:
            if key == 'offsety' :
                value = -0.5
            casted_value = types[key](value)
            setattr(self, key, casted_value)


C'est un peu bourrin, mais ça marche !
Merci beaucoup, j'étais vraiment coincée.
0
Whismeril Messages postés 19033 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 avril 2024 931
5 avril 2022 à 21:01
Non non, ça n'est surtout pas une solution

D'abord, par ce que cette fonction fait partie d'un package auquel tu n'as pas à toucher.

Ensuite parce que l'erreur ne vient pas de là.

Et encore parce que dans un jeu, il est très rare qu'une classe n'ait qu'une seule instance.
En faisant ça toutes les instances auront le même offset en Y et y'a toutes les chances que ça mette la garouille.

Et enfin, et surtout, parce que le job de cette fonction c'est de remplir des attributs à partir de valeur en string. L'attribut offsety doit représenter un int, or en y mettant un float il y aura forcément un mauvais résultat => la valeur finale sera soit 0 soit -1 et donc le résultat ne sera pas ce que tu attends.

Bref, le problème vient que tu donnes à cette fonction de mauvais paramètres, il faut trouver pourquoi et corriger la fourniture

0
Quelquundebien
6 avril 2022 à 11:54
Je vais essayer de faire ça tu as raison, en attendant je garde cette solution de secours, mais je vais fouiller
0
Avez-vous trouvé une solution ?
0
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 750
Modifié le 25 avril 2022 à 13:10
Comme dit plus haut, il faut contrôler le premier argument qui est passé à la fonction
int
, qui n'est probablement ni un type numérique, ni une chaîne dont le contenu correspond à un entier. Voici quelques exemples qui montrent ce qu'on a le droit ou pas d'écrire :

x = int(5) # OK
x = int(5, base=10) # OK
x = int(-0.5) # OK
x = int(-0.5, base=10) # Pas OK
x = int("5", 10) # OK
x = int("-0.5", 10) # Pas OK


Dans le cas de Quelquundebien, le problème est plus profond comme le souligne Whismeril : cette erreur est la conséquence d'une erreur faite en amont, qui amène à propager vers cette fonction un mauvais argument.

Pour plus d'information, il faudrait voir le code dans son ensemble (ou plus exactement, remonter la pile d'appel de fonctions et contrôler les arguments qui ont été propagés pour identifier la fonction coupable). Dans son message, Quelquundebien n'a reporté que la dernière fonction de la pile d'appel, mais il y en a sûrement plusieurs autres avant. Il au faudrait insérer au début de chaque fonction mise en jeu ajouter
print(locals())
. Cela permettrait de voir jusqu'où les arguments semblent corrects et ainsi identifier la fonction qui a introduit un mauvais argument.

Bonne chance
0