Erreur de typage
helena8686
Messages postés
8
Statut
Membre
-
khrug -
khrug -
Bonjour,
Mon but avec la fonction filecarresrouges_aux est d'appliquer la fonction appellecourant_aux (qui renvoie une liste de deux éléments) à chaque élement de ma file.
En réponse, j'ai comme message d'erreur
Est-ce que je peux avoir une explication s'il vous plait ?
Mon but avec la fonction filecarresrouges_aux est d'appliquer la fonction appellecourant_aux (qui renvoie une liste de deux éléments) à chaque élement de ma file.
def filecarresrouges_aux (file) :
while file != [] :
p = file.pop(0)
n, m = p[0], p[1]
if n != (-1) :
l = appellecourant_aux (n, m)
if l[0] != (-1) :
file.extend([l[0], l[1]])
filecarresrouges_aux (file)
En réponse, j'ai comme message d'erreur
line 5, in filecarresrouges_aux
TypeError: 'int' object is not subscriptable
Est-ce que je peux avoir une explication s'il vous plait ?
6 réponses
-
Bonsoir.
L'erreur est en ligne 4n, m = p[0], p[1]
, cela signifie que p est un entier, pourquoi ? C'est à toi de voir ce que contient file avant le 1er appel de cette fonction dans ton code. -
Bonsoir,
Voici l'entièreté de mon code :
def randompremierplastique () : n = 15*randint (0, 39) m = 15*randint (0, 49) while recherche_aux (n, m, listeterre) or recherche (n, m) == "pas de courants marins" : n = 15*randint (0, 39) m = 15*randint (0, 49) f = [n, m] return f def filecarresrouges_aux (file) : p = file.pop(0) n, m = p[0], p[1] l = appellecourant_aux (n, m) if l[0] != (-1) : file.extend(l) filecarresrouges_aux (file) def filecarresrouges (i) : filecarresrouges_aux (randompremierplastique())
Ainsi, avant le premier appel de filecarresrouge, file est le résultat que retourne la fonction randompremierplastique(), qui est une liste. Ce n'est donc pas un entier .. -
Oui, c'est une liste, mais
file.pop(0)
correspond au 1er entier de cette liste...
Si tu veux avoir 2 éléments pour l'indice 0 de ta liste file, alors f dans ta fonction randompremierplastique devrait êtref = [(n, m)]
-
J'ai changé, mais j'ai maintenant un nouveau problème.
def randompremierplastique () : n = 15*randint (0, 39) m = 15*randint (0, 49) while recherche_aux (n, m, listeterre) or recherche (n, m) == "pas de courants marins" : n = 15*randint (0, 39) m = 15*randint (0, 49) f = [n, m] return f def filecarresrouges_aux (file) : while file != [] : file2 = [] n, m = file.pop(0), file.pop(0) l = appellecourant_aux (n, m) p2 = l.pop(0) if p2[0] != -1 : file2.extend([p2]) file = file2[0] def filecarresrouges (i) : filecarresrouges_aux (randompremierplastique())
Je suis certain que ma fonction apppellecourant_aux renvoie une liste d'une sous liste à deux éléments (ex : l = [[5,7]]).
Pourtant, j'ai ce message d'erreur :
File "<stdin>", line 7, in filecarresrouges_aux
AttributeError: 'NoneType' object has no attribute 'pop' -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Bonjour.
Si python dit que l vaut None, il ne se trompe pas, donc il faut voir ce que retourne ta fonction appellecourant_aux, peut-être qu'il y a un comportement inattendu, un effet de bord, ou alors une simple erreur d'inattention ou de logique du code. -
def arrivesurlaterre (n, m) : C.create_rectangle (n+3, m+3, n+12, m+12, fill='yellow') return [[-1, -1]] def pasverslagauche (n, m) : j = randint(0, 4) if j == 0 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+18, m+3, n+27, m+12, fill='red') return [[n+15, m]] elif j == 1 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m+18, n+12, m+27, fill='red') return [[n, m+15]] elif j == 2 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m-12, n+12, m-3, fill='red') return [[n, m-15]] else : arrivesurlaterre (n, m) def pasversladroite (n, m) : j = randint(0, 4) if j == 0 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] elif j == 1 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m+18, n+12, m+27, fill='red') return [[n, m+15]] elif j == 2 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m-12, n+12, m-3, fill='red') return [[n, m-15]] else : arrivesurlaterre (n, m) def pasverslehaut (n, m) : j = randint(0, 4) if j == 0 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+18, m+3, n+27, m+12, fill='red') return [[n+15, m]] elif j == 1 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m+18, n+12, m+27, fill='red') return [[n, m+15]] elif j == 2 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] else : arrivesurlaterre (n, m) def pasverslebas (n, m) : j = randint(0, 4) if j == 0 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+18, m+3, n+27, m+12, fill='red') return [[n+15, m]] elif j == 1 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] elif j == 2 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m-12, n+12, m-3, fill='red') return [[n, m-15]] else : arrivesurlaterre (n, m) #fonctions pour chaque courant (8 chances sur 10 de suivre le courant principal) def courantdroite (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+18, m+3, n+27, m+12, fill='red') return [[n+15, m]] else : pasversladroite (n, m) def courantgauche (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] else : pasverslagauche (n, m) def couranthaut (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m-12, n+12, m-3, fill='red') return [[n, m-15]] else : pasverslehaut (n, m) def courantbas (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m+18, n+12, m+27, fill='red') return [[n, m+15]] else : pasverslebas (n, m) def appellecourant_aux (n, m) : r = recherche(n, m) if r == "gauche" : courantgauche (n, m) elif r == "bas" : courantbas(n, m) elif r == "droite" : courantdroite(n, m) elif r == "haut" : couranthaut (n, m) elif r == "pas de courants marins" : if recherche_aux (n+15, m, listeterre) : silyaterreadroite (n, m) elif recherche_aux (n-15, m, listeterre) : silyaterreagauche (n, m) elif recherche_aux (n, m+15, listeterre) : silyaterreenbas (n, m) elif recherche_aux (n, m-15, listeterre) : silyaterreenhaut (n, m) else : j = randint(0, 4) if j == 0 : courantbas (n, m) elif j == 1 : courantdroite (n, m) elif j == 2 : courantgauche (n, m) else : couranthaut (n, m) else : arrivesurlaterre (n, m)
Je dois sûrement être bigleu :') ?-
-
-
Ça me semble compliqué car il va falloir ajouter beaucoup de return dans tes fonctions.
Prenons le 1er test dans appellecourant_aux, il faut donc faire un return de ce que va renvoyer l'appel à courantgauche
if r == "gauche" : return courantgauche (n, m)
Dans courantgauche, il y a bien un return, mais pas dans le else, donc.
def courantgauche (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] else : return pasverslagauche (n, m)
Idem pour pasverslagauche
def pasverslagauche (n, m) : # code else : return arrivesurlaterre (n, m)
Et ainsi de suite pour toutes ces fonctions.
Bon courage ^^
-