Tutorial Python PDF
Tutorial Python PDF
Tutorial Python PDF
Raphael.Marvie@lifl.fr
6 juillet 2005
Version 1.0.1
2
c
°2003-2005, Raphaël Marvie
Avant-propos
Ce support propose une initiation au langage Python par l’exemple. Il fait suite à
une formation d’une semaine et comportant 6 cours. Cette version essaye de compléter
les transparents, mais ne regroupe malheureusement pas tout le discours accompgnant la
présentation des transparents. La formation se faisant en salle machine, tous les exemples
étaient testés pendant le cours. Cette approche est volontairement conservée ici et il est
conseillé d’utiliser ce support avec un interpréteur lancé pour «voir ce qui se passe».
Ce support de cours est destiné à un public étant familier avec au moins un langage
de programmation, si possible orienté objet, et être familier avec les notions d’objet. Ce
support n’est pas un cours de programmation, ni un cours complet sur le langage Python,
il ne représente qu’une initiation à différentes choses que l’on peut faire avec Python. La
version utilisée dans ce support est la 2.3.5. Les premiers compléments de ce support sont
les documents associés au langage Python comme la librairie standard [7] le manuel de
référence [8] ou bien le tutoriel officiel [9].
Sans ambition d’être suffisant, la mise en ligne de ce support a pour unique objectif
d’être éventuellement utile. Le format retenu permet une impression en «deux par page».
Toute remarque concernant ce support est toujours la bienvenue !
r.m.
3
4
c
°2003-2005, Raphaël Marvie
Table des matières
Avant-propos 3
Introduction 9
1 Premiers pas 11
1.1 Utilisation de Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2 Structures de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.1 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.2 Typage en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.3 Arithmétique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.4 Chaı̂nes de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.5 Listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.6 Listes et chaı̂nes de caractères . . . . . . . . . . . . . . . . . . . . . 17
1.2.7 Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.2.8 Dictionnaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.3 Constructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.1 Structuration et indentation . . . . . . . . . . . . . . . . . . . . . . 20
1.3.2 Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3.3 Boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3.4 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.3.5 Documenter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4 Autres éléments sur les séquences . . . . . . . . . . . . . . . . . . . . . . . 24
1.4.1 Manpulation de séquences . . . . . . . . . . . . . . . . . . . . . . . 24
1.4.2 Boucles for problématiques . . . . . . . . . . . . . . . . . . . . . . 25
1.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.5.1 Manipulations de données . . . . . . . . . . . . . . . . . . . . . . . 26
5
6 TABLE DES MATIÈRES
2.2.3 Le module re . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.4 Le module os . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.2.5 Le module os.path . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.2.6 Les modules glob et fnmatch . . . . . . . . . . . . . . . . . . . . . 35
2.2.7 Le module getpass . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3 Built-in en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3.1 Les fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3.2 Conversions de type . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.3.3 Evaluation dynamique . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.3.4 Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.4.1 Utilitaire de sauvegarde . . . . . . . . . . . . . . . . . . . . . . . . 39
2.4.2 Extraction de données . . . . . . . . . . . . . . . . . . . . . . . . . 40
4 Python et XML 55
4.1 XML, avec une vision DOM . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.1 Langages de balises . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.2 XML, quels outils ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.3 DOM, petit rappel . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.4 Exemple du chapitre . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.2 Naviguer dans un arbre DOM . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.2.1 minidom «il fait le maximum» . . . . . . . . . . . . . . . . . . . . . 57
4.2.2 Parser un document XML . . . . . . . . . . . . . . . . . . . . . . . 57
4.2.3 Parcourir un arbre DOM . . . . . . . . . . . . . . . . . . . . . . . . 57
c
°2003-2005, Raphaël Marvie
TABLE DES MATIÈRES 7
c
°2003-2005, Raphaël Marvie
8 TABLE DES MATIÈRES
Remerciements 91
c
°2003-2005, Raphaël Marvie
Introduction
Un peu d’histoire
Python est un langage de programmation objet interprété. Son origine est le langage de
script du système d’exploitation Amoeba (1990). Il a été développé par Guido Von Rossum
au CWI, à l’Université d’Amsterdam et nommé par rapport au Monthy Python’s Flying
Circus.
Depuis, Python est devenu un langage de programmation généraliste (comp.lang.python
est créé en 1994). Il offre un environnement complet de développement comprenant un
interpréteur performant et de nombreux modules. Un atout indéniable est sa disponibilité
sur les plates-formes courantes.
Python est un langage open source supporté, développé et utilisé par une large com-
munauté : 300, 000 utilisateurs et plus de 500, 000 downloads par an.
9
10 TABLE DES MATIÈRES
Quand Python ? Python est un très bon langage pour le développement agile [1] et
itératif. Il permet d’être réactif et évite le cycle lourd programmer / compiler / tester.
De plus, le langage permet de vérifier très rapidement des hypothèses de mise en œuvre.
Une fois la solution réalisée en Python, il est alors toujours possible de l’optimiser en
redéveloppant certain de ses composants en C++ par exemple.
Python permet de produire des applications facilement extensibles non seulement par
le développeur mais aussi par l’usager.
Enfin, Python est un bon candidat pour l’automatisation de tâches systèmes. Le système
d’administration de la distribution Gentoo Linux portage est développé en Python.
Quand pas python ? Dynamicité est rarement compatible avec performance, Python
n’est donc certainement pas le meilleur langage pour faire du traitement intensif.
Dans certain cas, les usagers préfèrent limiter l’utilisation de Python à l’aspect intégration
de composants afin de produire des systèmes performants. La version Python fournit une
preuve de concept ou une version fonctionnelle avant de redévelopper les points faibles.
Une certitude pour terminer, Python permet d’identifier rapidement une mauvaise
idée...
c
°2003-2005, Raphaël Marvie
Chapitre 1
Premiers pas
11
12 Premiers pas
2
En Python, ce calcul se résume à la possibilité pour l’objet de recevoir un message particulier.
3
Il est toutefois à noter que cette faclité ne devrait être utilisées que sous couvert du polymorphisme,
sans quoi la lisibilité du programme s’en trouve réduite.
c
°2003-2005, Raphaël Marvie
1.2 Structures de base 13
1.2.3 Arithmétique
Python permet d’exprimer très simplement des opérations arithmétiques. Dans le cas
où tous les opérandes sont des entiers, alors les résultats seront aussi des entiers. Lors-
qu’au moins un des opérandes est de type réel, alors tous les opérandes sont automati-
quement convertis en réels. La colonne de droite du listing suivant présente des opérations
élémentaires sur des entiers, la colonne de droite sur des réels.
>>> x = 1 + 2
>>> y = 5 * 2
>>> y / x
3
>>> y % x
2
>>> y = 5.5 * 2
>>> y
11.0
>>> x = 12.0 / 3
>>> x
4.0
Dans le contexte de l’arithmétique, les affections peuvent prendre deux formes. Ces deux
formes ont un sens différent. Le listing suivant présente deux affectations qui pourraient être
comprises de manière identique. Toutefois, la première forme (ligne 2) a pour conséquence
de créer une nouvelle instance d’entier pour contenir l’ajout de 2 à la valeur de x. La seconde
forme (ligne 3) ajoute 2 à la valeur de x sans créer de nouvelle instance. La manière d’écrire
une opération a donc un impact sur son évaluation.
>>> x = 4
>>> x = x + 2
> > > x += 2
c
°2003-2005, Raphaël Marvie
14 Premiers pas
1.2.4.1 Concaténation
La concaténation de ces chaı̂nes de caractères peut prendre deux formes. Dans les deux
cas, l’opérateur + est utilisé pour exprimer la concaténation. La forme de droite est un
raccourci d’écriture.
>>> x = x + y > > > x += y
>>> x >>> x
’ hello world ! ’ ’ hello world ! ’
1.2.4.2 Affichage
L’affichage de chaı̂nes de caractères à l’aide de la fonction print peut se faire en
concaténant explicitement des chaı̂nes (que ce soit avec l’opérateur de concaténation ou en
utilisant des virgules) ou en utilisant une chaı̂ne de formatage comme la fonction printf du
langage C. Cette seconde option est un peu plus puissante, mais aussi un peu plus lourde
à utiliser. Le listing suivant présente trois manière d’afficher des chaı̂ne de caractères.
> > > print ’I say : ’ + x
I say : hello world !
> > > print x , 2 , ’ times ’
hello world ! 2 times
> > > print " I say : % s % d time ( s ) " % ( x , 2)
I say : hello world ! 2 time ( s )
1.2.4.3 Manipulations
Python offre une méthode simple pour accéder aux caractères contenus dans une chaı̂ne :
une chaı̂ne est manipulée comme une séquence indexée de caractères. Ainsi, chaque ca-
ractère est accessible directement par son index (le premier étant indexé 0) en utilisation
des crochets. En plus de cet accès unitaire aux caractères, il est possible d’accéder à des
sous-chaı̂nes en précisant la tranche souhaitée l’index de début (qui est inclu) étant séparé
de l’index de fin (qui est exclu) par le caractère ‘ :’. Dans le cas des sous-chaı̂nes, la valeur
fournie est une copie et non un accès à une partie de la chaı̂ne d’origine.
Le listing suivant donne quelques exemples d’accès à un caractère (ligne 2), ou à une
sous-chaı̂ne pour le reste. La colonne de gauche présente des accès à partir du début de
la chı̂nes (les index sont positifs). La ligne 6 signifie que l’on souhaite le contenu de x du
quatrième caractère à la fin. La colonne de droite présente des exemples de manipulation
où certains index sont donnés à partir de la fin de la chaı̂ne (ils sont négatifs). Enfin, la
dernière ligne réalise une copie de la chaı̂ne x.
> > > x = ’ hello world ! ’
> > > x [4]
’o ’
> > > x [2:4] > > > x [ -3:]
’ ll ’ ’ ld ! ’
c
°2003-2005, Raphaël Marvie
1.2 Structures de base 15
1.2.5 Listes
Les listes Python sont des ensemble ordonnés et dynamique d’éléments. Ces ensemble
peuvent contenir des éléments de différents types, leur seul point commun est que ce sont
des objets. Et comme tout est objet, les listes sont elles mêmes des objets (instances de la
classe list). L’exemple suivant cré tout d’abord une variable contenant la valeur vrai, puis
une liste nommée foo contenant la chaı̂ne ’bar’, l’entier 12345 et le contenu de la variable
x.
> > > x = True
> > > foo = [ ’ bar ’ , 12345 , x ]
L’ajout d’éléments dans une liste se fait à l’aide des méthodes append pour un ajout en
fin de liste, et insert, pour un ajout à un index donné. Enfin, la méthode extend ajoute
le contenu d’une liste passé en paramètre à la fin de la liste.
> > > foo . append ( ’ new ’)
> > > foo
[ ’ bar ’ , 12345 , 1 , ’ new ’]
> > > foo . insert (2 , ’ new ’)
> > > foo
[ ’ bar ’ , 12345 , ’ new ’ , 1 , ’ new ’]
> > > foo . extend ([67 , 89])
> > > foo
[ ’ bar ’ , 12345 , ’ new ’ , 1 , ’ new ’ , 67 , 89]
La méthode index permet de connaı̂tre l’index de la première occurence d’un élément
dans une liste. Dans le cas où l’élément fournit en paramètre n’est pas présent, la méthode
lève l’exception ValueError. L’utilisation de la construction in retourne quant à elle True
si l’élément est présent dans la liste et False sinon.
> > > foo . index ( ’ new ’)
2
> > > foo . index (34)
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in ?
ValueError : list . index ( x ): x not in list
> > > 34 in foo
False
Les listes et les chaı̂nes ont pour point commun le fait d’être des ensembles ordonnés.
L’accès à un élément d’une liste se fait donc aussi par indexation (ligne 1). Il est possible de
c
°2003-2005, Raphaël Marvie
16 Premiers pas
prendre une partie de liste (ligne 3) et d’obtenir une copie de liste (ligne 5). Cette dernière
manipulation est très importante lors de parcours de listes (voir section 1.4.2) pour ne pas
modifier la liste qui est parcourrue.
> > > foo [2]
’ new ’
> > > foo [1: -3]
[12345 , ’ new ’ , 1]
> > > bar = foo [:]
> > > bar . append (3)
> > > foo [ -1:]
[89]
> > > bar [ -1]
3
Les listes peuvent être fusionnées par concaténation. Ces concaténations peuvent aussi
se faire par copie ou par ajout. La ligne 1 représente une concaténation par copie des deux
listes existantes. La ligne 4 présente est une copie par concaténation d’éléments à une liste
existante. Enfin, la ligne 7 présente une manière simple de créer une liste par répétition
d’un motif (qui est une sous liste).
>>> bar = [0 , 1] + [1 , 0]
>>> bar
[0 , 1 , 1 , 0]
>>> bar += [2 , 3]
[0 , 1 , 1 , 0 , 2 , 3]
>>> bar
>>> [0 , 1] * 3
[0 , 1 , 0 , 1 , 0 , 1]
De manière symétrique à l’ajout d’éléments dans une liste, il est possible d’en supprimer.
La méthode remove permet de supprimer la première occurence d’un élément d’une liste en
le désignant (ligne 1). Si l’élément fourni en paramétre n’existe pas dans la liste, l’exception
ValueError est levée (ligne 4). L’opérateur del (delete) permet de détruire tout objet
Python, y compris une sous liste (ligne 8).
> > > foo . remove ( ’ new ’)
> > > foo
[ ’ bar ’ , 12345 , 1 , ’ new ’ , 67 , 89]
> > > foo . remove (34)
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in ?
ValueError : list . remove ( x ): x not in list
> > > del foo [1:3]
> > > foo
[ ’ bar ’ , ’ new ’ , 67 , 89]
c
°2003-2005, Raphaël Marvie
1.2 Structures de base 17
La notion de list mapping permet d’appliquer une opération sur tous les éléments d’une
liste. La ligne 2 dit que tout élément de foo est multiplié par deux4 .
> > > foo = [1 , 2 , 3 , 4]
> > > [ elt * 2 for elt in foo ]
[2 , 4 , 6 , 8]
1.2.7 Tuples
Les tuples sont des ensemble ordonnés et immuables d’éléments. Comme les listes, les
tuples peuvent contenir des données de différents types. La ligne 1 présente une déclaration
classique (avec des parenthèses) alors que la ligne 2 présente la notation abrégée. La virgule
est importante pour préciser que l’on parle d’un tupe à un élément et non de la valeur 12.
Cette remarque serait valable dans la cas d’une déclaration parenthésée d’un tuple à un
élément.
> > > foo = ( ’ bar ’ , 12345 , x )
> > > bar = 12 ,
Comme les listes, les tuples sont accessibles par indexation (ligne 1 et 3), et la construc-
tion in permet de tester l’existance (ligne 5). Cependant, une fois créé le contenu d’un tuple
ne peut être modifié.
4
Cette construction est très proche de la programmation fonctionnelle telle que fournie par Lisp.
c
°2003-2005, Raphaël Marvie
18 Premiers pas
1.2.8 Dictionnaires
Les disctionnaires, parfois appelés tableaux associatifs, sont des ensembles non ordonnés
d’éléments indexés par des clés. Une clé doit obligatoirement être immuable (chaı̂ne, entier
ou tuple). D’autre part, une clé est toujours unique. Un dictionnaire vide est déclaré par
deux accolades (ligne 1). L’ajout (ligne 2 et 3) et l’accès (ligne 6) aux éléments d’un
dictionnaire se fait par indexation sur la clé associé à l’élément. L’affichage d’un dictionnaire
(ligne 5) présente une liste de paires «clé : valeur».
> > > mydict = {}
> > > mydict [ ’ foo ’ ] = 456
> > > mydict [123] = ’ bar ’
> > > mydict
{123: ’ bar ’ , ’ foo ’ : 456}
> > > mydict [123]
’ bar ’
c
°2003-2005, Raphaël Marvie
1.2 Structures de base 19
Les dictionnaires offrent des méthodes pour manipuler les clés. La méthode keys re-
tourne une liste de toutes les clés du dictionnaire (ligne 1) et la méthode has_key retourne
True so la clé donné en paramètre est présente dans le dictionnaire et False dans le cas
contraire.
> > > mydict . keys ()
[123 , ’ foo ’]
> > > mydict . has_key ( ’ bar ’)
False
La méthode values donne accès à une liste des valeurs contenues dans le dictionnaire
(ligne 1) et la méthode items donne une liste de tuples, contenant chacun une paire clé,
valeur (ligne 3)..
> > > mydict . values ()
[ ’ bar ’ , 456]
> > > mydict . items ()
[(123 , ’ bar ’ ) , ( ’ foo ’ , 456)]
La modification d’une valeur associée à une clé se fait simplement en affectant de
nouveaux la valeur indéxée dans le dictionnaire par la clé en question (ligne 1). Enfin,
l’opérateur del permet de supprimer une associaion association du dictionnaire (ligne 4).
> > > mydict [123] = 789
> > > mydict
{123: 789 , ’ foo ’ : 456}
> > > del mydict [ ’ foo ’]
> > > mydict
{123: 789}
A l’aides des méthodes de manipulation des clé et des valeurs, il est possible de parcourir
un dictionnaire de plusieurs manières. Les quelques lignes suivantes donnent deux exemples
de parcours.
> > > flames = { ’ windows ’ : ’ bof ’ , ’ unix ’ : ’ cool ’}
> > > for key in flames . keys ():
... print key , ’ is ’ , flames [ key ]
...
windows is bof
unix is cool
> > > for key , value in flames . items ():
... print key , ’ is ’ , value
...
windows is bof
unix is cool
Ce dernier exemple présente un parcours de dictionnaire avec une utilisation d’un list
mapping et d’une chaı̂ne de formattage (dont l’utilisation ne se limite pas à l’affichage).
> > > bar = { ’a ’ : ’ aa ’ , ’b ’ : ’ bb ’ , ’c ’ : ’ cc ’}
c
°2003-2005, Raphaël Marvie
20 Premiers pas
1.3 Constructions
1.3.1 Structuration et indentation
La structuration d’un programme Python est définie par son indentation. Le début
d’un bloc est défini par un ’ :’, la première ligne pouvant être considérée comme un en-tête
(test, boucle, définition, etc.). Le corps du bloc est alors indenté de manière plus importante
(mais régulière) que l’en-tête. Enfin, la fin du bloc est délimité par le retour à l’indentation
de l’en-tête. Les bloc peuvent être imbriqués
<en - tete >:
< instructions >
Dans le cas de bloc de taille réduite, par exemple une seule instruction, un bloc peut
être défini sur une seule ligne. Le caractère ‘ :’ sert toujours de délimiteur entre l’en-tête
et le corps. Les instructions du corps sont alors séparés par des ‘ ;’5 . Cependant, cette
utilisation n’est pas nécessairement bénéfique quant à la lisibilité du code, elle est donc à
éviter6 .
> > > < en - tete >: < instruction > ; < instruction >
Cette structuration est utilisée aussi bien pour définir des boucles, des tests, des fonc-
tions, des classes ou des méthodes.
1.3.2 Tests
Conditions booléennes En Python, tout ce qui n’est pas faux est vrai. Les conditions
booléennes fausses se résument au données «vide» : False, 0, "", [], {}, (), None.
Python offre une seule construction pour réaliser des tests : le if then else. Une par-
ticularité de cette mise en œuvre est la possibilité d’enchaı̂ner les tests avec la construction
elif.
if x == ’ hello ’:
print ’ hello too ! ’
elif x == ’ bonjour ’:
print ’ bonjour aussi ! ’
else :
print ’ moi pas comprendre ’
5
L’utilisation des ‘ ;’ en Python est optionnelle en fin de ligne et peut toujours être utilisée pour séparer
deux instructions sur une même ligne.
6
L’époque où les caractères étaient comptés dans une fichier est bien révolue.
c
°2003-2005, Raphaël Marvie
1.3 Constructions 21
Les comparaisons entre séquences (chaı̂nes de caractères, listes et tuples) se fait selon
l’ordre lexicographique. Les deux tests suivants sont vrais.
(1 , 2 , 3) < (1 , 2 , 4)
(1 , 2 , 3) < (1 , 2 , 3 , 4)
1.3.3 Boucles
Deux types de boucles sont disponibles : les boucles énumérées (for) et les boucles
basées sur un test de fin (while). Ces deux constructions suivent le même schéma : un
en-tête qui décrit l’évolution de la boucle, un ensemble d’isntructions qui sont évaluées à
chaque tour de boucle et une partie optionnel qui est évaluée en sortie de boucle (introduite
par le mot-clé else). Enfin, comme en C les boucles peuvent contenir les branchements
continue pour passer à l’itération suivante et break pour sortir de la boucle (dans ce cas
la clause else n’est pas évaluée).
c
°2003-2005, Raphaël Marvie
22 Premiers pas
1.3.4 Fonctions
Il n’y a que des fonctions en Python. Une fonction est définie avec le mot clé def. Un
fonction retourne toujours une valeur. Si une fonction ne contient pas de clause return, la
valeur None est alors retournée7 .
> > > def fib ( n ): # suite de fibonacci jusque n
... a, b = 0, 1
... while b < n :
... print b ,
... a, b = b, a + b
...
7
Il est éventuellement possible de parler de procédure dans ce cas
c
°2003-2005, Raphaël Marvie
1.3 Constructions 23
1.3.5 Documenter
La documentation fait partie intégrante du code. En plus de la possibilité de mettre
des commentaires avec l’utilisation de #, Python offre la possiblité d’écrire du code auto-
documenté. Ceci est valable pour les fonctions, les classes et les modules. Une telle do-
cumentation d’un élément est accessible vie l’attribut __doc__ de ces différents éléments.
Cette technique est utilisable automatiquement par les environnements intégrés de développement
ou par l’utilisation de la fonction help en mode interactif.
La définition des commentaires avec # devrait être réservé aux remarques techniques
sur le code et pour les développeur de l’élément en question. La documentation doit quant
à elle être destinée au développeurs mais surtout aux utilisateurs de l’élément documenté.
Elle doit donc refléter le comportement de l’élément. Cette seconde forme est à mettre en
parallèle avec la javadoc.
8
Ici encore, cela sent la programmation fonctionnelle type Lisp à plein nez. . .
9
Nous verrons un peu plus tard que ce n’est pas la seule possibilité.
c
°2003-2005, Raphaël Marvie
24 Premiers pas
dummy ()
Cette fonction est du pipeau ...
1.4.1.1 filter
La fonction filter applique la fonction passée en premier argument sur chacun des
éléments de la séquence passée en second argument et retourne une nouvelle liste qui
contient tous les éléments de la séquence pour lesquels la fonction a retourné une valeur
vrai.
>>> def funct1 ( val ):
... return val > 0
...
>>> filter ( funct1 , [1 , -2 , 3 , -4 , 5])
[1 , 3 , 5]
>>> def iseven ( x ):
... return x % 2
10
Même si la documentation tient sur une seule.
c
°2003-2005, Raphaël Marvie
1.4 Autres éléments sur les séquences 25
...
> > > filter ( iseven , [1 , 2 , 3 , 4 , 5 , 6])
[1 , 3 , 5]
1.4.1.2 map
La fonction map applique la fonction passée en premier argument sur chacun des
éléments de la ou des séquences passées en paramètre. Dans le cas où plusieurs séquences
sont passées en paramètre, la fonction doit prendre autant de paramètres qu’il y a de
séquences. map retourne une liste contenant le résultat de chacun des calculs.
>>> def sum ( x , y ):
... return x + y
...
>>> map ( sum , [1 , 2 , 3] , [4 , 5 , 6])
[5 , 7 , 9]
>>> map ( iseven , [1 , 2 , 3 , 4 , 5 , 6])
[1 , 0 , 1 , 0 , 1 , 0]
1.4.1.3 reduce
La fonction reduce applique réduit une séquence par l’application récursive d’une fonc-
tion sur chacun de ses éléments. La fonction passée comme premier paramètre doit prendre
deux arguments. La fonction map prend un troisième paramètre optionel qui est la valeur
initiale du calcul récursif.
> > > reduce ( sum , [1 , 2 , 3 , 4 , 5])
15
> > > reduce ( sum , [1 , 2 , 3 , 4 , 5] , -5)
10
c
°2003-2005, Raphaël Marvie
26 Premiers pas
...
>>> a
[5 , 3 , 1 , 1 , -2 , 3 , -4 , 5 , -6]
1.5 Exercices
1.5.1 Manipulations de données
Le fichier listetu.py contient une liste de 10 dictionnaires. Etudier cette structure de
données et écrire une fonction qui écrit sur la sortie standard (en sautant une ligne entre
chaque fiche) :
dossier : 1
nom : doe
prenom : john
universite : lille1
discipline : informatique
niveau : 4
moyenne : 17
c
°2003-2005, Raphaël Marvie
Chapitre 2
27
28 Quelques modules et built-in
#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-
#
# examples.py
#
"""
Regroupe les définitions des fonctions relatives au chapitre 1 de
‘Initiation a python par l’exemple’.
"""
3
Nous considérons ici que l’interpréteur a été lancé dans le répertoire contenant le fichier examples.py.
4
Dnas le cas d’un import de plusieurs fonctionnalités, les noms sont séparés par des virgules.
c
°2003-2005, Raphaël Marvie
2.1 Définition et utilisation de modules 29
c
°2003-2005, Raphaël Marvie
30 Quelques modules et built-in
les modules contenant des sous-modules, encore nommés packages, sont définis comme des
répertoires sur le système de fichier. Le nommage des modules se fait alors par concaténation :
mod.submod. Afin de faciliter la portabilité du code, tout répertoire doit contenir un fichier
nommé __init__.py. Pour permettre le chargement de tous les sous-modules, ce fichier
doit contenir la liste des modules du package (réprtoire) stockée dans la variable __all__.
$ cat graphical / __init__ . py
__all__ = [ ’ basic ’ , ’ advanced ’]
ps1, ps2 Variables contenant les valeurs des prompts, par défaut ’>>>’ et ’...’.
c
°2003-2005, Raphaël Marvie
2.2 Quelques modules standards et utiles 31
strip expandtabs permettent de gérer les espaces dans une chaı̂ne de caractères en sup-
primant les blancs non significatifs ou en remplaçant les tabulations par un nombre
fixe d’espaces.
c
°2003-2005, Raphaël Marvie
32 Quelques modules et built-in
find permet de rechercher un motif dans une chaı̂ne (à partir du début ou de la fin pour
rfind) en retournant l’indice où le motif est trouvé pour la première fois ou -1. (La
fonction index est similaire mais lève une exception pour un motif non trouvé.)
> > > string . find ( ’ bonjour le monde ’ , ’ on ’)
1
> > > string . rfind ( ’ bonjour le monde ’ , ’ on ’)
12
> > > string . rfind ( ’ bonjour le monde ’ , ’ om ’)
-1
split permet de découper une chaı̂ne en une liste de mots (par défaut sur les espaces, ou
alors sur une chaı̂ne passée en second argument) et join permet l’opération inverse
qui est de construire une chaı̂ne à partir d’une liste de mots et une chaı̂ne de liaison.
> > > string . split ( ’ foo bar 123 ’)
[ ’ foo ’ , ’ bar ’ , ’ 123 ’]
> > > string . split ( " hello world " , " wo " )
[ ’ hello ’ , ’ rld ’]
> > > string . join ([ ’ foo ’ , ’ bar ’ , ’ 123 ’] , ’; ’)
’ foo ; bar ;123 ’
count replace permettent respectivement de compter les occurence d’un motif dans une
chaı̂ne et le remplacement de ce motif par un autre.
> > > string . count ( ’ bonjour le monde ’ , ’ on ’)
2
> > > string . replace ( ’ bonjour le monde ’ , ’ on ’ , ’ ONON ’)
’ bONONjour le mONONde ’
zfill center rjust ljust permettent de gérer l’affichage : zfill complète un nombre
avec des zéros en tête pour une largeur d’affichage constant, les trois autres fonctions
permettent de justifier une phrase sur une largeur donnée.
> > > string . zfill ( str (123) , 5)
’ 00123 ’
> > > string . center ( ’ hi ! ’ , 10)
’ hi ! ’
> > > string . rjust ( ’ hi ! ’ , 10)
’ hi ! ’
> > > string . ljust ( ’ hi ! ’ , 10)
’ hi ! ’
c
°2003-2005, Raphaël Marvie
2.2 Quelques modules standards et utiles 33
2.2.3 Le module re
Ce module permet la manipulation des expressions régulières [2]. Ces expressions sont
par défaut identiques à Perl et l’ouvrage «Mastering Regular Expressions» de Jeffrey Friedl
(O’Reilly) est un bon complément pour qui doit utiliser les expressions régulières. Afin de
ne pas devoir toujours utiliser des ‘\’ dans les expressions, il est possible d’utiliser des Raw
regular expressions en préfixant la chaı̂ne définissant l’expression par un ‘r’ : r’(.*)\n’. La
dernière question qu’il faut se poser avant de commencer à utiliser les expressions régulières
est l’encodage supporté. Le module re peut utiliser l’un ou l’autre de ces deux modules :
– sre Support unicode (module utilisé par défaut, implémentation masquée par re)
– pre Sans support unicode (mais ce module est désormais deprecated )
match (pattern, chaine) test si la chaı̂ne commence par le pattern et retourne un objet
de type SRE_Match décrivant la réponse ou bien None.
> > > res = re . match ( ’ abr ’ , ’ abracadabra ’)
> > > matching ( res )
(0 , 3)
sub (pattern, repl, chaine) retourne une chaı̂ne ou toutes les occurences du pattern
dans la chaı̂ne fournie sont remplacés par repl. La chaı̂ne n’est pas modifiée, une
copie est créée.
> > > re . sub ( ’ hello ’ , ’ bonjour ’ , ’ hello foo hello bar ’)
’ bonjour foo bonjour bar ’
c
°2003-2005, Raphaël Marvie
34 Quelques modules et built-in
2.2.4 Le module os
Ce module permet d’accéder aux fonctions des systèmes d’exploitation et de faire de la
programmation système ou de l’administration. Les fonctions sont disponibles sur (presque)
tous les système. Toutefois, il faut toujours être conscient des limites pour la portabilité
du code : la notion de droits sur un fichier n’est pas similaire sur tous les systèmes.
Les principaux sous modules deos sont :
– path manipulation de chemins,
– glob fnmatch pattern matching de fichiers et répertoires,
– time accès et manipulation de l’heure,
– getpass manipulation de mots de passe et identifiants. utilisateur
c
°2003-2005, Raphaël Marvie
2.2 Quelques modules standards et utiles 35
exists isdir isfile permettent de tester l’existance et le type d’un fichier (ou répertoire).
> > > os . path . exists ( ’/ tmp / bar . txt ’)
False
> > > os . path . isdir ( ’/ tmp ’)
True
> > > os . path . isfile ( ’/ tmp ’)
False
c
°2003-2005, Raphaël Marvie
36 Quelques modules et built-in
fnmatch et filter permettent de faire du pattern matching sur des chaı̂nes de caractères
représentant des noms de fichiers : respectivement est ce qu’un nom suit un pattern
de nommage et quels sont les éléments d’une liste respectant un pattern.
> > > fnmatch . fnmatch ( ’ examples . py ’ , ’ *. py ’)
1
> > > fnmatch . filter ([ ’ examples . py ’ , ’ hello . pyc ’] , ’ *. py ’)
[ ’ examples . py ’]
getpass() demande proprement (en masquant les caractères saisis) un mot de passe à
l’usager. L’appel à cette fonction est bloquant jusqu’à ce que l’usager ait tapé entrée.
> > > p = getpass . getpass () # bloquant jusqu ’ au ’\ n ’
Password :
> > > print p
’ q u e lma u v ai s m o t d e p a s s e ’
c
°2003-2005, Raphaël Marvie
2.3 Built-in en Python 37
readlines () permet de lire toutes les lignes d’un fichier en une seule fois (retourne une
séquence de chaı̂nes).
> > > foo . readlines ()
[ ’ bonjour le monde !\ n ’ , ’ au revoir le monde !\ n ’]
read ([n]) permet de lire tout le fichier à partir de la position courante, ou au maximum
n octets lorque un argument est donné. Cette fonction retourne une chaı̂ne. La fonc-
tion seek permet de se déplacer dans le fichier de façon absolue : ici nous retournons
au début (indice 0).
> > > foo . seek (0) ; foo . read ()
’ hello world !\ nbonjour le monde !\ nau revoir le monde !\ n ’
> > > foo . close ()
Comparaison des approches de lecture Il n’y a pas de solution idéale pour la lecture
des fichiers. Il faut choisir en fonction de la situation et des besoins.
– La lecture globale (readlines) d’un fichier est plus performante pour l’aspect récupération
des informations car elle représente un gros accès disque puis un parcours de séquence
en mémoire. Toutefois, cette approche est coûteuse en mémoire vive : imaginez la
présence d’un fichier texte de 500Mo en mémoire.
– Lecture ligne par ligne (readline) est plus coûteuse pour lire un fichier car elle
représente de nombreux accès disques pour des petites quantités d’information. Tou-
tefois, cette approche permet de manipuler des gros fichiers : un fichier de 10Go peut
être lu ligne par ligne sur une machine ayant 64Mo de mémoire.
c
°2003-2005, Raphaël Marvie
38 Quelques modules et built-in
writelines permet d’écrire des données contenues dans une séquence (de chaı̂nes). Si
chaque chaı̂ne contenue dans la séquence représente une ligne de texte dans le fichier,
il faut alors qu’elles contiennent la séquence de fin de ligne ‘\n’.
> > > lines = [ ’ bonjour le monde !\ n ’ , ’ au revoir le monde !\ n ’]
> > > foo . writelines ( lines )
> > > foo . close ()
c
°2003-2005, Raphaël Marvie
2.4 Exercices 39
compile () retourne une version compilée de l’expression (ou du fichier) passé en pa-
ramètre. Le second argument précise où doit se faire la sortie d’erreur au cas où une
exception serait levée. Le dernier argument précise quel usage est envisagé, ici nous
prévoyons de l’utiliser avec la fonction eval()
> > > obj = compile ( ’x + 1 ’ , ’ < string > ’ , ’ eval ’)
> > > obj
< code object ? at 0 x81685d8 , file " < string > " , line -1 >
2.3.4 Assertions
Les assertions permettent de traiter les situations sans appel : soit la condition est
respectée, soit le programme est arrêté. (Dans la pratique, une exception est levée.)
assert évalue une expression logique et arrête le programme en affichant un message
d’erreur (qui est optionnel et fourni séparé par une virgule) si l’expression logique est
fausse (cf section 1.3.2). L’expression peut inclure des appels de fonctions.
> > > assert 1
> > > assert 0 , ’ oups ’
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in ?
AssertionError : oups
> > > try : assert 0
... except AssertionError : print ’ sic ’
...
sic
2.4 Exercices
2.4.1 Utilitaire de sauvegarde
En s’aidant de la fonction os.stat qui permet de connaı̂tres la dates de modification
des fichiers, écrire un utilitaire de backup d’une arborescence. Cet utilitaire doit faire un
backup incrémental (sauf la première fois) des fichiers modifiés.
> > > print os . stat . __doc__
stat ( path ) - > ( st_mode , st_ino , st_dev , st_nlink ,
c
°2003-2005, Raphaël Marvie
40 Quelques modules et built-in
c
°2003-2005, Raphaël Marvie
Chapitre 3
41
42 Plongeon dans les objets
3.1.3 Classes
3.1.3.1 Définition et instanciation
La définition d’une classe suit la règle des blocs (cf section 1.3.1) en utilisant le mot clé
class. Toute méthode est définie comme une fonction avec un premier argument (self)
qui représente l’objet sur lequel elle sera appliquée à l’exécution. En Java ou C++, le this
est définie implicitement, en Python il est explicite est c’est toujours le premier paramètre
d’une méthode. Le nom est libre, mais on utilise en général self. Une méthode ne prenant
pas de paramètres aura donc quand même un argument.
> > > class Dummy :
... def hello ( self ):
... print ’ hello world ! ’
L’instanciation se fait sans mot clé particulier (il n’y a pas de new en Python). Il suffit
de faire suivre un nom de classe de parenthèses (cnotenant ou non des paramètres) pour
déclancher une instanciation. L’invocation se fait à l’aide de la notation pointée, un appel
de méthode sur une variable référençant un objet.
> > > d = Dummy ()
>>> d
< __main__ . Dummy instance at 0 x817b124 >
> > > d . hello ()
hello world !
Les attributs sont définis à leur première affectation. Une variable est considérée comme
un attribut si elle est «rattachée» à l’objet : elle est accédée par self. Tout accès à un
attribut ou à une méthode de l’objet se fait obligatoirement par la variable self. Le
constructeur est une «méthode» nommée __init__. Comme toute méthode, certain de
ses paramètres peuvent avoir des valeurs par défaut (un seul constructeur en Python).
> > > class Compteur :
... def __init__ ( self , v = 0):
... self . val = v
... def value ( self ):
... return self . val
En termes de génie logiciel (et de bon sens), il est recommandé de toujours initiali-
ser l’état des objets (ses attributs) lors de son l’instanciation, donc dans le constructeur.
D’autre part, un constructeur qui ne fait rien n’est pas stupide ! Il dit clairement ce qu’il
en est : l’absence de constructeur ne serait pas un oubli.
c
°2003-2005, Raphaël Marvie
3.1 Des objets, que des objets 43
3.1.4 Héritage
Python supporte l’héritage simple et l’héritage multiple. Dans une relation d’héritage,
il est faut préciser le nom de la classe mère (entre parenthèses après le nom de la classe en
cours de définition) et appeler explicitement le constructeur de la super classe.
class A :
def __init__ ( self , n = ’ none ’ ):
self . _name = n
def name ( self ):
return self . _name
class B ( A ):
def __init__ ( self , val = 0 , n = ’ none ’ ):
A . __init__ ( self , n )
self . _wheels = val
def wheels ( self ):
return self . _wheels
Dans le cas de l’héritage multiple, il suffit de préciser les différentes classes mères et
d’appeler leurs constructeurs respectifs.
class C :
def __init__ ( self , t = ’ ’ ):
self . _title = t
def title ( self ):
return self . _title
class D ( A , C ):
def __init__ ( self , n = ’ none ’ , t = ’ ’ ):
A . __init__ ( self , n )
C . __init__ ( self , t )
def fullname ( self ):
return self . _title + ’ ’ + self . _name
L’exemple suivant donne une utilisation des trois classes précédentes. Il n’y a rien de
particulier, à l’utilisation que la classe ait été définie entièrement ou par héritage ne change
rien.
>>> a = A ( ’ rafi ’)
> > > print a . name ()
rafi
>>> b = B (4 , ’ car ’)
> > > print b . name ()
car
> > > print b . wheels ()
4
>>> d = D ( t = ’ dr ’)
> > > print d . fullname ()
dr none
c
°2003-2005, Raphaël Marvie
44 Plongeon dans les objets
c
°2003-2005, Raphaël Marvie
3.1 Des objets, que des objets 45
c
°2003-2005, Raphaël Marvie
46 Plongeon dans les objets
NoConflict
Il est possible de définir dynamiquement des attributs sur une classe ou une instance.
Ce genre de facilité ne se limite pas à l’aspect ludique, c’est parfois la meilleure solution à
un problème. Toutefois, attention où l’on met les pieds lorsque l’on modifie dynamiquement
des objets.
> > > class Empty :
... pass
> > > Empty . value = 0
> > > def funct ( self ):
... self . value += 1
... return self . value
...
> > > Empty . funct = funct
> > > dir ( Empty )
[ ’ __doc__ ’ , ’ __module__ ’ , ’ funct ’ , ’ value ’]
> > > e = Empty ()
> > > e . funct ()
1
c
°2003-2005, Raphaël Marvie
3.1 Des objets, que des objets 47
c
°2003-2005, Raphaël Marvie
48 Plongeon dans les objets
getmodule () donne le nom du module définissant l’objet (sans garantie par exemple
dans le cas du code dynamiquement créé).
> > > inspect . getmodule ( Conflict )
< module ’ examples ’ from ’ examples . py ’ >
c
°2003-2005, Raphaël Marvie
3.2 Les exceptions en python 49
34 class Conflict :
35 ’ ’ ’ Illustration de conflit attribut / methode ’ ’ ’
36 def __init__ ( self ):
37 self . name = ’ Conflict ’
38 def name ( self ):
39 return ’ You will never get this string ! ’
c
°2003-2005, Raphaël Marvie
50 Plongeon dans les objets
__main__ . MonErreur
> > > raise MonErreur ()
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in ?
__main__ . MonErreur
> > > raise NameError , ’ cela coince ’
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in ?
NameError : cela coince
Une exception peut aussi contenir des attributs et méthodes (en général pour fournir de
l’information). Ici, la méthode standard __str__ (traduction de l’objet en chaı̂ne) et utilisée
pour accéder facilement à la valeur contenue dans l’exception (par défaut le mécanisme
d’exception appelle cette méthode). Pour fournir de l’information à une exception, il suffit
de l’instancier en passant des paramètres au constructeur lors de l’utilisation de raise.
> > > class MonErreurToo ( Exception ):
... def __init__ ( self , val = None ):
... self . _value = val
... def __str__ ( self ):
... return str ( self . _value )
...
> > > raise MonErreurToo (12)
Traceback ( most recent call last ):
File " < stdin > " , line 1 , in ?
__main__ . MonErreurToo : 12
c
°2003-2005, Raphaël Marvie
3.2 Les exceptions en python 51
c
°2003-2005, Raphaël Marvie
52 Plongeon dans les objets
try et ce qu’il y ait ou non eu une exception de levé. Attention : Un return dans le
finally masque un return dans le try.
try :
< instructions >
finally :
< traitements ésystmatiques >
Attention : Dans ce cas, on ne sait pas ce qui s’est mal passé. Il n’y a pas moyen de
faire de gestion d’erreur dans le finally qui «laisse filer» les exceptions.
> > > try :
... raise K eyboar dInterrupt
... finally :
... print ’ ki C ki A ta P < ctrl -C > ? ’
...
ki C ki A ta P < ctrl -C > ?
Traceback ( most recent call last ):
File " < stdin > " , line 2 , in ?
Keybo ardInt errupt
Il n’est pas possible de composer les deux formes dans un seul bloc, l’utilisation im-
briquée des deux formes est donc parfois nécessaire.
c
°2003-2005, Raphaël Marvie
3.3 Exercices 53
3.3 Exercices
3.3.1 Premières classes
– Implanter des classes Pile et File utilisant les liste comme structure de données
interne et respectant l’interface suivante (utiliser l’héritage).
class Base :
def pop ( self ):
pass
def push ( self , elt ):
pass
– Reprendre l’exercice 2.4.2 en implantant les fonctionnalités au sein d’une classe.
c
°2003-2005, Raphaël Marvie
54 Plongeon dans les objets
c
°2003-2005, Raphaël Marvie
Chapitre 4
Python et XML
55
56 Python et XML
mémoire comme un arbre d’objets représentant les noeuds du document. Les interfaces
standard DOM sont les suivantes.
Interface Représentation de
Node Interface de base des noeuds
NodeList Séquence de noeuds
Document Représente un document complet
Element Elément de la hiérarchie
Attr Noeud représentant un attribut d’un noeud
Comment Noeud repréntant un commentaire
Text Noeud de données textuelles
c
°2003-2005, Raphaël Marvie
4.2 Naviguer dans un arbre DOM 57
childNodes donne accès aux fils d’un noeud (sous la forme d’une liste).
> > > doc . childNodes
[ < DOM Element : contacts at 137763676 >]
> > > doc . childNodes [0] . hasChildNodes
1
c
°2003-2005, Raphaël Marvie
58 Python et XML
isSameNode () permet de tester si deux noeuds sont égaux (égalité au sens de l’indentité,
parle-t-on de la même personne).
> > > root . firstChild . isSameNode ( root . lastChild )
0
> > > root . firstChild . isSameNode ( root . childNodes [0])
1
c
°2003-2005, Raphaël Marvie
4.3 Accéder aux informations d’un noeud 59
c
°2003-2005, Raphaël Marvie
60 Python et XML
c
°2003-2005, Raphaël Marvie
4.4 Construire un document XML 61
createAttribute (name) crée un noeud de type Attr avec le nom name. Une fois le
noeud créé, la valeur peut être fixée avec l’attribut nodeValue.
> > > rootattr = newdoc . createAttribute ( ’ name ’)
> > > rootattr . nodeValue = ’ foo ’
c
°2003-2005, Raphaël Marvie
62 Python et XML
insertBefore (new, old) ajoute un élément avant un fils donné d’un noeud.
> > > newroot . insertBefore ( comment , textnode )
< DOM Comment node " a very use ... " >
replaceChild (new, old) remplace un élément fils d’un noeud par un autre élément.
setAttribute (name, value) crée un nouvel attribut sur un noeud sans passer par une
instance de type Attr.
> > > newroot . setAttribute ( ’ usefull ’ , ’ nop ’)
c
°2003-2005, Raphaël Marvie
4.5 Exercices 63
4.5 Exercices
Le fichier etudiants.xml contient 400 dossiers d’étudiants (générés aléatoirements)
avec la structure décrite ci-dessous. Le but de l’exercice est de produire trois listes sous
forme de fichiers XML contenant (par ordre décroissant pour les deux premières) les
étudiants admissibles, sur liste complémentaire ou refusés.
<? xml version = " 1.0 " ? >
< etudiants >
< etudiant nom = " doe " prenom = " john " dossier = " 0 " >
< origine universite = " mit " / >
< formation discipline = " informatique " niveau = " 4 " / >
< resultats moyenne = " 16 " / >
</ etudiant >
c
°2003-2005, Raphaël Marvie
64 Python et XML
c
°2003-2005, Raphaël Marvie
Chapitre 5
close () ferme le fichier (requis ou non selon les implémentations, pour être sûr que les
données sont sauvées il vaut mieux utiliser explicitement close).
> > > file . close ()
La lecture et l’écriture se fait comme dans un dictionnaire, mais les clés sont obligatoi-
rement des chaı̂nes. L’exemple suivant crée deux entrées (foo et bar) dans le fichier
DBM, les re-lit et ferme le fichier.
> > > file = anydbm . open ( ’ blabla ’ , ’c ’)
> > > file [ ’ foo ’ ] = ’ perrier c foo ’
> > > file [ ’ bar ’ ] = ’ cd bar ; more beer ’
> > > print file [ ’ foo ’]
perrier c foo
> > > print file [ ’ bar ’]
cd bar ; more beer
> > > file . close ()
65
66 Python et la persistance de données
keys () donne la liste des clés du fichier. Obtenir les clé est un pré-requis à tout parcours
d’un fichier DBM.
> > > file . keys ()
[ ’ foo ’ , ’ bar ’]
> > > for key in file . keys (): print key , file [ key ]
foo ’ perrier c foo ’
bar ’ cd bar ; more beer ’
del permet de supprimer une entrée (ce qui suit le fonctionnememnt standard d’un disc-
tionnaire).
> > > file . keys ()
[ ’ foo ’ , ’ bar ’]
> > > del file [ ’ foo ’]
> > > file . keys ()
[ ’ bar ’]
> > > len ( file )
1
> > > file . close ()
5.1.2 Limitations
Les fichiers DBM permettent uniquement de rendre persistant des chaı̂nes de caractères.
La conversion objet vers chaı̂ne (et réciproquement) doit être gérée manuellement, ce qui
rend leur utilisation rapidement complexe pour des objets composites.
c
°2003-2005, Raphaël Marvie
5.2 Pickle et Shelve 67
La manipulation des données utilise un fichier par action de sérialisation, où les données
sont stockées sous forme de chaı̂nes. Il n’y a pas de structuration des données (donc pas
de recherche rapide).
c
°2003-2005, Raphaël Marvie
68 Python et la persistance de données
5.2.5 Remarques
– La concurrence de mise à jour n’est pas supportée avec shelve, une possibilité est
d’utiliser fcntl.
– La définition des classes doit être importable au moment du chargement dse données
par pickle.
– La compatibilité des fichiers n’est pas garantie entre deux implémentations de DBM.
Il n’y a donc que portabilité du code, pas des données.
c
°2003-2005, Raphaël Marvie
5.3 Python et SQL 69
L’utilisation d’une base de données est ici illustré avec une base Postgres2 . Le module
psycopg fournit l’accès à une base Postgres depuis Python. Il permet de trouver le bon
compromis entre la puissance du langage et de la base de données : réaliser une partie des
traitements sur les données en SQL et une partie en Python.
Des curseurs sont utilisés pour les interactions avec la base : émission de requêtes SQL.
Ils sont créés par l’objet connexion. Un curseur offre la méthode execute qui permet
de demander à la base l’évaluation d’une requête SQL. Le curseur est ici utilisé pour
créer une table test1 ayant un seul champ val de type entier. Ensuite, le curseur
est utilisé pour faire 10 insertions dans cette table.
> > > curseur = connexion . cursor ()
> > > curseur . execute (
... " CREATE TABLE test1 ( val int4 ) " )
> > > for i in range (10):
... curseur . execute (
... " INSERT INTO test1 VALUES (% d ) " , (i ,))
Exemples d’insertions. Une insertion peut se faire en utilisant un tuple (comme dans
l’exemple précédent) ou un dictionnaire pour fournir les valeurs. Dans le cas de l’uti-
lisation des tuples, les données sont prises dans l’ordre du tuple qui doit être de
même longueur que le tuple de format de la requête (argument de la clause VALUES).
L’exemple suivant crée une nouvelle table et utilise un dictionnaire pour fournir les
2
La même chose avec MySQL diffère peu, par exemple sur la connexion et la gestion des commits, à
ajouter.
c
°2003-2005, Raphaël Marvie
70 Python et la persistance de données
Les resultats de requêtes (réponses à une command select) sont des structures de données
Python : listes (ensemble des réponses) de tuples (les données d’une réponse). Les
opération fetchone() et fetchall() offertes par le curseur permettent de récupérer
respectivement une valeur (en fait les valeurs une par une) ou toutes les valeurs3 .
L’exemple suivant exécute une requête sur la base et récupère d’abord la première
réponse, en affichant le premier champs, puis toutes les réponses restantes, en affi-
chant les deux champs.
> > > curseur . execute ( " SELECT * FROM test2 " )
> > > prem = curseur . fetchone ()
> > > print prem [0]
doe
> > > valeurs = curseur . fetchall ()
> > > for v in valeurs :
... print v [0] , v [1]
...
martin pierre
dupont paul
c
°2003-2005, Raphaël Marvie
5.4 Exercices 71
La récupération des données binaire est similaire aux données classiques. L’exemple sui-
vant récupère la photo qui est stockée dans la base et la sauvegarde dans un fichier
nommé new_shoes.jpg.
>>> curseur = connexion . cursor ()
>>> curseur . execute ( ’ SELECT * FROM test3 ’)
>>> val = curseur . fetchone ()
>>> open ( ’ new_ ’ + val [1] , ’ wb ’ ) . write ( val [2])
5.4 Exercices
5.4.1 Module «Modèle» du MVC
Ecrire un script Python qui crée une table représentant des étudiants avec les champs
suivants (le type des données est précisé entre parenthèses) : num dossier (int4), nom
(text), prénom (text), université (text), discipline (text), niveau (int4), moyenne(int4).
Ecrire un programme Python chargeant l’ensemble des données du fichier etudiants.xml
dans cette table. Pour cela, une partie du code de l’exercice précédent est réutilisable pour
le parcours de l’arbre DOM.
c
°2003-2005, Raphaël Marvie
72 Python et la persistance de données
c
°2003-2005, Raphaël Marvie
Chapitre 6
73
74 Python et les interfaces graphiques
c
°2003-2005, Raphaël Marvie
6.1 Python et Tkinter 75
c
°2003-2005, Raphaël Marvie
76 Python et les interfaces graphiques
c
°2003-2005, Raphaël Marvie
6.1 Python et Tkinter 77
L’événement «reçu» par un handler contient des informations qui peuvent être in-
terprétées dans le cadre du traitement. L’exemple suivant définit deux fonctions dont le
but est d’afficher un caractère tapé au clavier et d’afficher les coordonnées de la souris.
La classe Tk représente la fenêtre principale du programme. Le label créé est associé à
cette fenêtre (premier paramètre du constructeur). Puis, les deux fonctions sont associées
au clavier et au clic sur le label. L’utilisation de focus selectionne le label pour recevoir
les événements clavier. Enfin, la boucle d’événements est démarré sur la fenêtre princi-
pale. Lorsque la fenêtre est acitive et que l’on tape une touche au clavier, cela génère un
événement passé à la fonction onKey qui va en extraire le caractère associé. (Même principe
pour le clic de souris.)
c
°2003-2005, Raphaël Marvie
78 Python et les interfaces graphiques
c
°2003-2005, Raphaël Marvie
6.1 Python et Tkinter 79
c
°2003-2005, Raphaël Marvie
80 Python et les interfaces graphiques
c
°2003-2005, Raphaël Marvie
6.2 Petit tour des widgets courants 81
>>> root = Tk ()
>>> ent = Entry ( root )
>>> ent . insert (0 , ’ Saisir texte ’)
>>> ent . pack ( side = TOP , fill = X )
>>> ent . bind ( ’ < Return > ’ , ( lambda event : fetch ()))
>>> b1 = Button ( root , text = ’ Fetch ’ , command = fetch )
>>> b1 . pack ( side = LEFT )
>>> b2 = Button ( root , text = ’ Quit ’ , command = root . destroy )
>>> b2 . pack ( side = RIGHT )
>>> root . mainloop ()
Manipulations de texte
– index dans une entrée de texte : De ’0’ à END,
– position d’insertion du curseur INSERT,
– get (deb, fin) retourne le texte à la position donnée,
– insert (pos, txt) insert le texte txt à la position pos,
– delete (deb [,fin]) supprime le texte entre les position deb et fin (le second est
optionnel).
c
°2003-2005, Raphaël Marvie
82 Python et les interfaces graphiques
Attention Les deux gestionnaires (cardinal et grille) ne se marient pas toujours bien.
Manipulation de texte
– index dans une zone de texte : de ’1.0’ (ligne.colonne) à END,
– INSERT donne la position d’insertion du curseur,
– SEL FIRST, SEL LAST contient les position de début et fin de la sélection,
– get (deb, fin) retourne le texte à la position donnée,
– get (’1.0’, END+’-1c’) retourne tout le texte contenu dans la zone.
– insert (’li.co’, txt) ajoute le texte à la position ’li.co’,
– delete (deb [,fin]) supprime le texte entre les position deb et fin,
c
°2003-2005, Raphaël Marvie
6.2 Petit tour des widgets courants 83
– search (chaine, deb, fin) retourne la position de début de la chaı̂ne dans la zone
de texte,
– see (’li.co’) Fait défiler l’affichage pour rendre la position donnée visible,
– pour les déplacements relatifs dans une zone de texte par rapport à une position :
+/- un certain nombre de ’c’ (caractère), ’w’ (mot) ou ’l’ (ligne).
6.2.4 Listboxes
Le widget Listbox permet de gérer des listes d’éléments et offre des méthodes pour
l’ajout, le retrait et la selection d’éléments. L’exemple suivant définit une listbox contenant
10 entrée et un bouton. L’utilisation du bouton déclanche la fonction fetch() qui affiche
sur la sortie standard l’entrée de la liste sélectionnée (ou la première ligne par défaut).
>>> def fetch ():
... print list . get ( ACTIVE )
...
>>> root = Tk ()
>>> list = Listbox ( root )
>>> list . pack ( side = TOP )
>>> Button ( root , text = ’ fetch ’ , command = fetch ) . pack ()
>>> idx = 0
>>> for i in range (10):
... list . insert ( idx , ’ ligne - ’ + str ( i ))
... idx += 1
...
>>> root . mainloop ()
Manipulation de listes
– index dans une liste : de ’0’ à END.
– curselection () retourne l’index selectionné,
– get (idx) retourne l’élément à l’index idx,
– get (ACTIVE) Retourne l’élément sélectionné,
– insert (idx, element) ajoute l’élément à l’index idx,
– delete (deb [,fin]) supprime les éléments entre les index deb et fin (le second est
optionnel).
c
°2003-2005, Raphaël Marvie
84 Python et les interfaces graphiques
>>> root = Tk ()
>>> frame = Frame ( root )
>>> frame . pack ( side = TOP )
>>> list = Listbox ( frame )
>>> sbar = Scrollbar ( frame )
>>> sbar . config ( command = list . yview )
>>> list . config ( yscrollcommand = sbar . set )
>>> sbar . pack ( side = RIGHT , fill = Y )
>>> list . pack ( side = LEFT , expand = YES , fill = BOTH )
>>> Button ( root , text = ’ fetch ’ , command = fetch ) . pack ( side = BOTTOM )
>>> idx = 0
>>> for i in range (100):
... list . insert ( idx , ’ ligne - ’ + str ( i )) ; idx +=1
...
>>> root . mainloop ()
Boı̂te à cocher L’exemple suivant crée un ensemble de trois boı̂tes à cocher dont la
valeur va être représentée par un entier. Chaque boı̂te est indépendante, et c’est le fait
c
°2003-2005, Raphaël Marvie
6.2 Petit tour des widgets courants 85
de mémoriser les trois variables Tkinter dans une liste qui les relie. La fonction state()
déclanchée par le bouton affiche l’état des différentes boı̂tes.
>>> vars = []
>>> root = Tk ()
>>> for item in [ ’ foo ’ , ’ bar ’ , ’ stuff ’ ]:
>>> var = IntVar ()
>>> Checkbutton ( root , text = item ,
... variable = var ). pack ( side = LEFT )
... vars . append ( var )
...
>>> def state ():
... for v in vars :
... print v . get () ,
...
>>> b = Button ( root , text = ’ State ’ , command = state )
>>> b . pack ( side = LEFT )
>>> root . mainloop ()
Boutons radio L’exemple suivant crée un ensemble de trois boutons radio dont la valeur
va être représentée par une chaı̂ne. Les trois boutons sont indépendant et c’est le fait
d’utiliser la même variable Tkinter qui les relie. La fonction state() déclanchée par le
bouton affiche le nom du bouton radio actuellement sélectionné.
>>> root = Tk ()
>>> var = StringVar ()
>>> for item in [ ’ foo ’ , ’ bar ’ , ’ stuff ’ ]:
... rb = Radiobutton ( root , text = item ,
... value = item ,
... variable = var )
... rb . pack ( side = LEFT )
...
>>> def state ():
... print var . get ()
...
>>> b = Button ( root , text = ’ State ’ , command = state )
>>> b . pack ()
>>> root . mainloop ()
c
°2003-2005, Raphaël Marvie
86 Python et les interfaces graphiques
Pour les interactions primitives avec l’usager, les widgets askyesno et askokcancel
permettent d’avoir une réponse booléenne à une question : 1 si ’yes’ et 0 si ’no’.
> > > root = Tk ()
> > > if askyesno ( ’ Question ’ , " Python c ’ est simple " ):
... showinfo ( ’ xxx ’ , ’ Merci !!! ’)
... else :
... showwarning ( ’ xxx ’ , ’ Dommage ... ’)
...
c
°2003-2005, Raphaël Marvie
6.3 Autres widgets prêt à l’emploi 87
Le module tkFileDialog fournit des boı̂tes de dialogue pour les interactions relatives
aux fichiers. Les différentes widgets offerts respectent les normes de l’interface graphique
(X11, Mac OS X ou MS-Windows) :
– askopenfilename, asksaveasfilename et askdirectory retournent le nom du fi-
chier selectionné ou une chaı̂ne vide,
– askopenfile et asksaveasfile retournent l’objet représentant le fichier en mode
’r’ (lecture), ’w’ (écriture) , ou None,
– filetypes, initialdir et initialfile sont des variables destinés configurer la
recherche de fichiers.
> > > from tkFileDialog import *
> > > askopenfilename ( filetypes =[( ’ Text ’ , ’. txt ’ )])
’/ home / rafi / enseign / python / bar . txt ’
> > > as ksave asfilename ( initialdir = ’/ tmp ’)
’/ tmp / foo . txt ’
c
°2003-2005, Raphaël Marvie
88 Python et les interfaces graphiques
L’organisation des menus dans la barre se fait à l’aide des variables et fonctions sui-
vantes :
– bd, relief nombre de points et relief du menu (RAISED, SUNKEN, RIDGE),
– add_separator () ajoute une séparation entre deux commandes d’un menu,
– add_cascade () création d’un sous-menu,
– entryconfig (num, state=...) fixe l’aspect disponible (ENABLED, valeur par défaut)
ou non disponible (DISABLED) d’une entrée d’un menu.
L’exemple suivant définit un sous menu «Stuff» à notre menu «File».
>>> submenu = Menu ( fbutton , tearoff =0)
>>> submenu . config ( bd =2)
>>> submenu . add_command ( label = ’ Sub stuff ( destroy ) ’ ,
... command = root . destroy ,
... underline =0)
>>> file . add_cascade ( label = ’ Stuff ’ , menu = submenu ,
... underline =0)
6.5 Exercices
6.5.1 Module «Vue» du MVC
Développer une interface graphique en utilisant Tkinter, reposant sur les traitements
du contrôleur défini dans le chapitre précédent et composées des éléments suivants :
c
°2003-2005, Raphaël Marvie
6.5 Exercices 89
– une Listbox associée à une Scrollbar donne la liste des numéros de dossier, nom
et prénom des étudiants ;
– un formulaire (ensemble de Label et Entry) donnant les information d’un étudiant
sélectionné dans la Listbox (par exemple avec un double clic) ;
– un formulaire de saisie associé à un Button pour entrer de nouvelles fiches d’étudiants.
c
°2003-2005, Raphaël Marvie
90 Python et les interfaces graphiques
c
°2003-2005, Raphaël Marvie
Remerciements
Merci à
– Thérèse Libourel pour m’avoir demandé de monter une formation d’une semaine à
Python et aux participants pour l’avoir suivie (base de la version 1.0.0).
– Fabien Devaux pour ses remarques sur le module re et sur la spécification de l’enco-
dage d’un fichier (prises en compte dans la version 1.0.1).
91
92 Python et les interfaces graphiques
c
°2003-2005, Raphaël Marvie
Annexe A
c
Copyright °2000,2001,2002 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies of this license document,
but changing it is not allowed.
Preamble
The purpose of this License is to make a manual, textbook, or other functional and
useful document ”free” in the sense of freedom : to assure everyone the effective freedom to
copy and redistribute it, with or without modifying it, either commercially or noncommer-
cially. Secondarily, this License preserves for the author and publisher a way to get credit
for their work, while not being considered responsible for modifications made by others.
This License is a kind of ”copyleft”, which means that derivative works of the document
must themselves be free in the same sense. It complements the GNU General Public License,
which is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because
free software needs free documentation : a free program should come with manuals provi-
ding the same freedoms that the software does. But this License is not limited to software
manuals ; it can be used for any textual work, regardless of subject matter or whether it
is published as a printed book. We recommend this License principally for works whose
purpose is instruction or reference.
93
94 GNU Free Documentation License
manual or work. Any member of the public is a licensee, and is addressed as ”you”. You
accept the license if you copy, modify or distribute the work in a way requiring permission
under copyright law.
A ”Modified Version” of the Document means any work containing the Document
or a portion of it, either copied verbatim, or with modifications and/or translated into
another language.
A ”Secondary Section” is a named appendix or a front-matter section of the Do-
cument that deals exclusively with the relationship of the publishers or authors of the
Document to the Document’s overall subject (or to related matters) and contains nothing
that could fall directly within that overall subject. (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any mathematics.) The
relationship could be a matter of historical connection with the subject or with related
matters, or of legal, commercial, philosophical, ethical or political position regarding them.
The ”Invariant Sections” are certain Secondary Sections whose titles are designated,
as being those of Invariant Sections, in the notice that says that the Document is released
under this License. If a section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero Invariant Sections.
If the Document does not identify any Invariant Sections then there are none.
The ”Cover Texts” are certain short passages of text that are listed, as Front-Cover
Texts or Back-Cover Texts, in the notice that says that the Document is released under
this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be
at most 25 words.
A ”Transparent” copy of the Document means a machine-readable copy, represented
in a format whose specification is available to the general public, that is suitable for revising
the document straightforwardly with generic text editors or (for images composed of pixels)
generic paint programs or (for drawings) some widely available drawing editor, and that
is suitable for input to text formatters or for automatic translation to a variety of formats
suitable for input to text formatters. A copy made in an otherwise Transparent file format
whose markup, or absence of markup, has been arranged to thwart or discourage subsequent
modification by readers is not Transparent. An image format is not Transparent if used for
any substantial amount of text. A copy that is not ”Transparent” is called ”Opaque”.
Examples of suitable formats for Transparent copies include plain ASCII without mar-
kup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available
DTD, and standard-conforming simple HTML, PostScript or PDF designed for human mo-
dification. Examples of transparent image formats include PNG, XCF and JPG. Opaque
formats include proprietary formats that can be read and edited only by proprietary word
processors, SGML or XML for which the DTD and/or processing tools are not generally
available, and the machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The ”Title Page” means, for a printed book, the title page itself, plus such following
pages as are needed to hold, legibly, the material this License requires to appear in the title
page. For works in formats which do not have any title page as such, ”Title Page” means
the text near the most prominent appearance of the work’s title, preceding the beginning
c
°2003-2005, Raphaël Marvie
A.2 Verbatim Copying 95
c
°2003-2005, Raphaël Marvie
96 GNU Free Documentation License
or state in or with each Opaque copy a computer-network location from which the general
network-using public has access to download using public-standard network protocols a
complete Transparent copy of the Document, free of added material. If you use the latter
option, you must take reasonably prudent steps, when you begin distribution of Opaque
copies in quantity, to ensure that this Transparent copy will remain thus accessible at the
stated location until at least one year after the last time you distribute an Opaque copy
(directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well
before redistributing any large number of copies, to give them a chance to provide you with
an updated version of the Document.
A.4 Modifications
You may copy and distribute a Modified Version of the Document under the conditions
of sections 2 and 3 above, provided that you release the Modified Version under precisely
this License, with the Modified Version filling the role of the Document, thus licensing
distribution and modification of the Modified Version to whoever possesses a copy of it. In
addition, you must do these things in the Modified Version :
A. Use in the Title Page (and on the covers, if any) a title distinct from that of the
Document, and from those of previous versions (which should, if there were any, be
listed in the History section of the Document). You may use the same title as a
previous version if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities responsible for
authorship of the modifications in the Modified Version, together with at least five
of the principal authors of the Document (all of its principal authors, if it has fewer
than five), unless they release you from this requirement.
C. State on the Title page the name of the publisher of the Modified Version, as the
publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications adjacent to the other
copyright notices.
F. Include, immediately after the copyright notices, a license notice giving the public
permission to use the Modified Version under the terms of this License, in the form
shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections and required Cover
Texts given in the Document’s license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled ”History”, Preserve its Title, and add to it an item
stating at least the title, year, new authors, and publisher of the Modified Version as
given on the Title Page. If there is no section Entitled ”History” in the Document,
create one stating the title, year, authors, and publisher of the Document as given
on its Title Page, then add an item describing the Modified Version as stated in the
c
°2003-2005, Raphaël Marvie
A.5 Combining Documents 97
previous sentence.
J. Preserve the network location, if any, given in the Document for public access to
a Transparent copy of the Document, and likewise the network locations given in
the Document for previous versions it was based on. These may be placed in the
”History” section. You may omit a network location for a work that was published at
least four years before the Document itself, or if the original publisher of the version
it refers to gives permission.
K. For any section Entitled ”Acknowledgements” or ”Dedications”, Preserve the Title
of the section, and preserve in the section all the substance and tone of each of the
contributor acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered in their text and in
their titles. Section numbers or the equivalent are not considered part of the section
titles.
M. Delete any section Entitled ”Endorsements”. Such a section may not be included
in the Modified Version.
N. Do not retitle any existing section to be Entitled ”Endorsements” or to conflict in
title with any Invariant Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or appendices that qualify as
Secondary Sections and contain no material copied from the Document, you may at your
option designate some or all of these sections as invariant. To do this, add their titles to
the list of Invariant Sections in the Modified Version’s license notice. These titles must be
distinct from any other section titles.
You may add a section Entitled ”Endorsements”, provided it contains nothing but
endorsements of your Modified Version by various parties–for example, statements of peer
review or that the text has been approved by an organization as the authoritative definition
of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up
to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified
Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added
by (or through arrangements made by) any one entity. If the Document already includes
a cover text for the same cover, previously added by you or by arrangement made by the
same entity you are acting on behalf of, you may not add another ; but you may replace
the old one, on explicit permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission
to use their names for publicity for or to assert or imply endorsement of any Modified
Version.
c
°2003-2005, Raphaël Marvie
98 GNU Free Documentation License
in the combination all of the Invariant Sections of all of the original documents, unmodified,
and list them all as Invariant Sections of your combined work in its license notice, and that
you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and multiple identical
Invariant Sections may be replaced with a single copy. If there are multiple Invariant
Sections with the same name but different contents, make the title of each such section
unique by adding at the end of it, in parentheses, the name of the original author or
publisher of that section if known, or else a unique number. Make the same adjustment
to the section titles in the list of Invariant Sections in the license notice of the combined
work.
In the combination, you must combine any sections Entitled ”History” in the various
original documents, forming one section Entitled ”History” ; likewise combine any sections
Entitled ”Acknowledgements”, and any sections Entitled ”Dedications”. You must delete
all sections Entitled ”Endorsements”.
c
°2003-2005, Raphaël Marvie
A.8 Translation 99
A.8 Translation
Translation is considered a kind of modification, so you may distribute translations of
the Document under the terms of section 4. Replacing Invariant Sections with translations
requires special permission from their copyright holders, but you may include translations
of some or all Invariant Sections in addition to the original versions of these Invariant
Sections. You may include a translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include the original
English version of this License and the original versions of those notices and disclaimers.
In case of a disagreement between the translation and the original version of this License
or a notice or disclaimer, the original version will prevail.
If a section in the Document is Entitled ”Acknowledgements”, ”Dedications”, or ”His-
tory”, the requirement (section 4) to Preserve its Title (section 1) will typically require
changing the actual title.
A.9 Termination
You may not copy, modify, sublicense, or distribute the Document except as expressly
provided for under this License. Any other attempt to copy, modify, sublicense or distribute
the Document is void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under this License will not
have their licenses terminated so long as such parties remain in full compliance.
c
°2003-2005, Raphaël Marvie
100 GNU Free Documentation License
c
Copyright °YEAR YOUR NAME. Permission is granted to copy, distribute
and/or modify this document under the terms of the GNU Free Documenta-
tion License, Version 1.2 or any later version published by the Free Software
Foundation ; with no Invariant Sections, no Front-Cover Texts, and no Back-
Cover Texts. A copy of the license is included in the section entitled ”GNU
Free Documentation License”.
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the
”with...Texts.” line with this :
with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover
Texts being LIST, and with the Back-Cover Texts being LIST.
If you have Invariant Sections without Cover Texts, or some other combination of the
three, merge those two alternatives to suit the situation.
If your document contains nontrivial examples of program code, we recommend relea-
sing these examples in parallel under your choice of free software license, such as the GNU
General Public License, to permit their use in free software.
c
°2003-2005, Raphaël Marvie
Bibliographie
101
102 BIBLIOGRAPHIE
c
°2003-2005, Raphaël Marvie