Erreur de typage

helena8686 Messages postés 8 Statut Membre -  
 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

  1. 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
  2. helena8686 Messages postés 8 Statut Membre
     
    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
  3. 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
  4. helena8686 Messages postés 8 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
  7. helena8686 Messages postés 8 Statut Membre
     
    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
    1. 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
    2. 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
    3. 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