TypeError: 'bool' object is not subscriptable

Alors que l'objet en question n'est pas un bool?

Le problème exposé dans ce sujet a été résolu.

Bonjour, J’ai l’erreur suivante :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{'exploding_selected': False, 'color': <Color.Blue: 4>}
Traceback (most recent call last):
  File "./main.py", line 152, in <module>
    main()
  File "./main.py", line 38, in main
    run(game_data)
  File "./main.py", line 75, in run
    interact(game_data)
  File "./main.py", line 99, in interact
    Table.explode_selected(table)
  File "./Table.py", line 124, in explode_selected
    exploded = explode_baloon(self, *self['selected'])
  File "./Table.py", line 231, in explode_baloon
    neighbours_positions = get_neighbours_positions(self, x, y)
  File "./Table.py", line 254, in get_neighbours_positions
    if neighbour['color'] == current['color']:
TypeError: 'bool' object is not subscriptable

Quand le code suivant est exécuté.

1
2
3
4
if neighbour:
    print(neighbour)
    if neighbour['color'] == current['color']:
        neighbours_positions.append(position)

Est-ce que quelqu’un saurait comment faire pour ne plus avoir ce problème ?

PS: Le print est présent uniquement pour le debug, sa sortie est à la première ligne des logs.
PPS: L’erreur n’est pas levée systématiquement. Je ne sais pas pourquoi car tous les neighbour ont la même structure ou valent False et ne passent pas le premier if.

+0 -0

Mais justement, neighbour vaut False ou un dictionnaire avec la structure :

1
{'exploding_selected': False, 'color': <Color.Blue: 4>}

Et si il vaut False, les lignes 2, 3 et 4 de l’extrait ci-dessus ne sont pas exécutées, et donc l’erreur n’est pas possible puisque la ligne qui la génère n’est pas exécutée.

C’est justement pour ça que je ne comprends pas pourquoi cette erreur arrive.

+0 -0

Ben visiblement, il y a un moment où neighbour vaut True (ou bien current est un booléen), l’interpréteur invente rien.

Sans le reste du code, on ne peut pas t’en dire plus que l’interpréteur.

+0 -0

Le fait que ta variable neighbour ou current est deux types de valeur possible est discutable niveau conception, ça va forcément provoquer des bugs voir des incompréhensions lors d’une prochaine lecture. Il faudra penser à une logique en ce sens ;)

En fait, j’ai une grille de valeurs qui représente un plateau. Chaque case peut être à False ou être un dictionnaire qui contient une balle.

Ça me permet de vérifier facilement si une case est vide en faisant if ball. (neighbour et current sont tous deux issus de cette grille.)

Après, comme pour la plupart des choix il est discutable. Tu aurais fait comment ?

+0 -0

L’idiome pour ça, c’est d’utiliser le singleton None pour marquer les choses vides et de tester avec neighbour is None ou neighbour is not None. On comprend tout de suite que None est sentinelle marquant un cas particulier qui ne correspond pas à une valeur "normale" de la variable.

+3 -0

En fait, j’ai une grille de valeurs qui représente un plateau. Chaque case peut être à False ou être un dictionnaire qui contient une balle.

Après, comme pour la plupart des choix il est discutable. Tu aurais fait comment ?

amael

Avec None comme indiqué par adri1, voir un dictionnaire vide puis un test du même style que tu as présenté. Mais cela va dépendre peut-être de la manière dont tu insères tes clés. Mais comme toujours une conception à la résolution d’un problème se réfléchi avant de coder et doit suivre une logique simple et efficace.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte