Le blog de Fatiha

Une geek de plus !

Erreur python : IndexError: list index out of range

 

Comme vous le savez tous, je débute en python. Je ne programme pas vraiment mais il m’arrive de devoir déboguer des programmes écrits en python. Ce matin, une erreur m’énerve particulièrement :

IndexError: list index out of range

Voilà ce que ça donne avec la trace complète de l’erreur :

Traceback (most recent call last):
File « monScript.py », line 357, in ?
main()
File « monScript.py », line 349, in main
maFonction(monParam)
File « monScript.py », line 246, maFonction
maVariable = str(dataLigne[monChamp])
IndexError: list index out of range

Je comprends que le script souhaite accéder à un index qui n’existe pas. Mais pour en avoir le cœur net, je lance une petite recherche sur Google et je tombe sur les sites suivants :

(j’ai remplacé les noms de fichier, de variables et de fonction pour conserver un minimum de confidentialité)

POO en python, un exemple avec les fonctions search et compile

 

J’ai essayé de prendre en compte les remarques et conseils que j’ai eus via ce blog et via twitter. Un grand merci à : @Abd_fr, @Niyyou et @kiki67100.  Pour coder cette classe, j’ai utilisé l’IDE PyCharm, IDE que m’a conseillé @Abd_fr. Je peux dire qu’il y a un avant et après PyCharm.

J’ai essayé de partir de mon précédent article et de perfectionner un peu les choses. Comme je le dis souvent, ce n’est encore qu’un début. Passons à la pratique.

La classe ci-dessous contient deux méthodes :

  • une méthode qui affiche les arguments passés lors de l’instanciation de l’objet personne => print_args
  • une méthode qui recherche une ville précise dans l’adresse donnée lors de l’instanciation de l’objet personne
Vous remarquerez que j’ai importé le module re. C’est indispensable pour pouvoir utiliser les méthodes compile et search. J’ai déjà parlé de la méthode search dans un précédent article. 
import re
__author__ = 'FATIHA'
class MyIdentityClass (object):
    def __init__(self,_firstname,_lastname,_address):
        self._firstname=_firstname
        self._lastname=_lastname
        self._address=_address

    def print_args(self):
        print self._firstname
        print self._lastname
        print self._address

    def search_city (self,_city):
        pattern = re.compile(_city)
        if pattern.search(self._address):
            print "Yes"
        else:
            print "No"

personne=MyIdentityClass("michel","dupont","70 avenue Mozart, 75016 Paris")
personne.print_args()
personne.search_city("Paris")
personne.search_city("Londres")

Le résultat est le suivant :

michel
dupont
70 avenue Mozart, 75016 Paris
Yes
No

Programmation orientée objet en python : ma première classe

 

Cet article fait suite à la série d’articles que je rédige sur le langage python.

Je ne vais pas revenir ce qu’est la programmation orientée objet, vous pouvez trouver énormément de définitions et de cours sur le sujet sur le net. Arrêtons-nous sur ce qu’est une classe et allons droit au but, comment créer uune classe en python et comment lui associer des objets et des méthodes. « Une classe crée un nouveau type où les objets sont des instances de la classe ». Cette définition est issue du site swaroopch.com. Elle est claire et précise. Nous savons maintenant ce qu’est une classe et ce qu’est un objet. Le troisième terme à comprendre est le terme méthode : « Les objets peuvent aussi avoir des fonctionnalités en utilisant des fonctions qui appartiennent à une classe. » Cette définition de la méthode est encore issue du site swaroopch.com.

Passons tout de suite à un cas pratique issu du site voidspace.org.uk :

class maPremiereClasse(object):
    """Class docstring."""

    def __init__(self, arg1, arg2):
        """Method docstring."""
        self.arg1 = arg1
        self.arg2 = arg2

    def printargs(self):
        """Method docstring."""
        print self.arg1
        print self.arg2

# l'instanciation de l'objet appelle la methode init
instance=maPremiereClasse("mon argument 1","mon argument 2")

print type(instance)

#appelle la methode printargs
instance.printargs()

Ce qui donne :

Au niveau de cette exemple, deux méthodes sont définies : la méthode __init__ et la méthode printargs. La méthode __init__ est optionnelle, elle peut ne pas figurer dans une classe définie par un utilisateur. Mais quand elle est définie, elle doit avoir comme premier argument self. Qu’est-ce que self ? Quand est-ce qu’il est utilisé et comment l’utiliser ?

Ce qu’on doit savoir c’est que le paramètre self est toujours passé en paramètre des méthodes de l’objet. Même si on ne sait pas encore à quoi il sert, il faut l’utiliser. Nous voyons d’ailleurs dans l’exemple ci-dessus qu’il est passé en paramètre de printargs et de la méthode __init__. Sur swaroopch.com, self est expliqué ainsi : « cette variable particulière fait référence à l’objet lui-même, et par convention on lui donne le nom de self. « 

Pour vérifier que j’ai bien compris les bases de la programmation orientée objet en python, je vais jouer au quizz du site du zéro. Cool, j’ai obtenu 20/20. C’est un bon début, cela signifie que je suis sur la bonne voie :)

Sources :

 

Manipuler les chaînes de caractères en python : fonction strip

 

Cet article fait suite à la série d’articles que je rédige sur le langage python.

Nous allons nous intéresser à la fonction strip, cette fonction supprime les espaces en début et en fin de chaîne. Si vous lui passez un paramètre, elle supprimera un caractère en particulier en début et en fin de chaîne. Passons tout de suite à la pratique :

texte1 = "      ceci est un exemple     "
texte2 = "******ceci est un exemple*****"
texte3 = "0000003456676767000000"

print texte1.strip()
print texte2.strip("*")
print texte3.strip("0")

Source :

- Fonction strip sur tutorialspoint.com

Python « IndentationError: unindent does not match any outer indentation level »

 

J’ai exécuté un script python qui m’a généré l’erreur ci-dessous :

   if maVariable is None :
                         ^
        IndentationError: unindent does not match any outer indentation level

=> Il y a un problème d’indentation, en relisant mon code, j’ai remarqué que j’avais mal positionné le bloc. En le positionnant correctement, l’erreur a disparu.

if maVariable is None :