Erreur de typage

helena8686 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
 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.

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

khrug
 
Bonsoir.

L'erreur est en ligne 4
n, 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.
1
helena8686 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
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 ..
0
khrug
 
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 être
f = [(n, m)]
0
helena8686 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
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'
0

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

Posez votre question
khrug
 
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.
0
helena8686 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
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 :') ?
0
khrug
 
Oui, en effet ^^

Ta fonction n'effectue aucun return, et par défaut les fonctions python return None.

Note, pourrais-tu utiliser la balise code python de façon à ce que ton code sur le forum soit formaté correctement ? Car là, c'est pas très lisible.
0
helena8686
 
Oups pardon c’est vrai que ce n’est pas lisible je ferai attention la prochaine fois ^^
Il suffirai que je mette « return » avant les fonctions que j’appelle dans apellecourant_aux ? (Ça m’étonnerai vu que ça marche toujours pas)
0
khrug
 
Ç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 ^^
0