Erreur de typage

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

  • Votes
  • Date
  • Date décroissante
  1. 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. 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 ..
      1. 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)]
        1. 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'
          1. 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.
            1. 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 :') ?
              1. 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.
              2. 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)
              3. Ç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 ^^