Académique Documents
Professionnel Documents
Culture Documents
L'interpréteur Python peut être facilement étendu par de nouvelles fonctions et types
de données implémentés en C ou C++ (ou tout autre langage appelable depuis le C).
Python est également adapté comme langage d'extension pour personnaliser des
applications.
Dans ce tutoriel, nous introduisons, de façon informelle, les concepts de base ainsi
que les fonctionnalités du langage Python et de son écosystème. Il est utile de
disposer d'un interpréteur Python à portée de main pour mettre en pratique les
notions abordées. Si ce n'est pas possible, pas de souci, les exemples sont inclus et
le tutoriel est adapté à une lecture "hors ligne".
1. Mise en bouche
2. Mode d'emploi de l'interpréteur Python
o 2.1. Lancement de l'interpréteur
2.1.1. Passage d'arguments
2.1.2. Mode interactif
o 2.2. L'interpréteur et son environnement
2.2.1. Encodage du code source
3. Introduction informelle à Python
o 3.1. Utilisation de Python comme une calculatrice
3.1.1. Les nombres
3.1.2. Chaînes de caractères
3.1.3. Listes
o 3.2. Premiers pas vers la programmation
4. D'autres outils de contrôle de flux
o 4.1. L'instruction if
o 4.2. L'instruction for
o 4.3. La fonction range()
o 4.4. Les instructions break, continue et les clauses else au sein des
boucles
o 4.5. L'instruction pass
o 4.6. Définir des fonctions
o 4.7. D'avantage sur la définition des fonctions
4.7.1. Valeur par défaut des arguments
4.7.2. Les arguments nommés
4.7.3. Listes d'arguments arbitraires
4.7.4. Séparation des listes d'arguments
4.7.5. Fonctions anonymes
4.7.6. Chaînes de documentation
4.7.7. Annotations de fonctions
o 4.8. Aparté : le style de codage
5. Structures de données
o 5.1. Compléments sur les listes
5.1.1. Utilisation des listes comme des piles
5.1.2. Utilisation des listes comme des files
5.1.3. Compréhensions de listes
5.1.4. Compréhensions de listes imbriquées
o 5.2. L'instruction del
o 5.3. Tuples et séquences
o 5.4. Ensembles
o 5.5. Dictionnaires
o 5.6. Techniques de boucles
o 5.7. Plus d'informations sur les conditions
o 5.8. Comparer des séquences avec d'autres types
6. Modules
o 6.1. Les modules en détail
6.1.1. Exécuter des modules comme des scripts
6.1.2. Les dossiers de recherche de modules
6.1.3. Fichiers Python "compilés"
o 6.2. Modules standards
o 6.3. La fonction dir()
o 6.4. Les paquets
6.4.1. Importer * depuis un paquet
6.4.2. Références internes dans un paquet
6.4.3. Paquets dans plusieurs dossiers
7. Les entrées/sorties
o 7.1. Formatage de données
7.1.1. Les chaines de caractères formatées (f-strings)
7.1.2. La méthode de chaine de caractères format()
7.1.3. Formatage de chaînes à la main
7.1.4. Anciennes méthodes de formatage de chaînes
o 7.2. Lecture et écriture de fichiers
7.2.1. Méthodes des objets fichiers
7.2.2. Sauvegarde de données structurées avec le module json
8. Erreurs et exceptions
o 8.1. Les erreurs de syntaxe
o 8.2. Exceptions
o 8.3. Gestion des exceptions
o 8.4. Déclencher des exceptions
o 8.5. Exceptions définies par l'utilisateur
o 8.6. Définition d'actions de nettoyage
o 8.7. Actions de nettoyage prédéfinies
9. Classes
o 9.1. Objets et noms : préambule
o 9.2. Portées et espaces de nommage en Python
9.2.1. Exemple de portées et d'espaces de nommage
o 9.3. Une première approche des classes
9.3.1. Syntaxe de définition des classes
9.3.2. Objets classes
9.3.3. Objets instances
9.3.4. Objets méthode
9.3.5. Classes et variables d'instance
o 9.4. Remarques diverses
o 9.5. Héritage
9.5.1. Héritage multiple
o 9.6. Variables privées
o 9.7. Trucs et astuces
o 9.8. Itérateurs
o 9.9. Générateurs
o 9.10. Expressions et générateurs
10. Survol de la bibliothèque standard
o 10.1. Interface avec le système d'exploitation
o 10.2. Jokers sur les noms de fichiers
o 10.3. Paramètres passés en ligne de commande
o 10.4. Redirection de la sortie d'erreur et fin d'exécution
o 10.5. Recherche de motifs dans les chaînes
o 10.6. Mathématiques
o 10.7. Accès à internet
o 10.8. Dates et heures
o 10.9. Compression de données
o 10.10. Mesure des performances
o 10.11. Contrôle qualité
o 10.12. Piles fournies
11. Survol de la bibliothèque standard -- Deuxième partie
o 11.1. Formatage de l'affichage
o 11.2. Gabarits (templates en anglais)
o 11.3. Traitement des données binaires
o 11.4. Fils d'exécution
o 11.5. Journalisation
o 11.6. Références faibles
o 11.7. Outils pour les listes
o 11.8. Arithmétique décimale à virgule flottante
12. Environnements virtuels et paquets
o 12.1. Introduction
o 12.2. Création d'environnements virtuels
o 12.3. Gestion des paquets avec pip
13. Pour aller plus loin
14. Édition interactive des entrées et substitution d'historique
o 14.1. Complétion automatique et édition de l'historique
o 14.2. Alternatives à l'interpréteur interactif
15. Arithmétique en nombres à virgule flottante : problèmes et limites
o 15.1. Erreurs de représentation
16. Annexe
o 16.1. Mode interactif
16.1.1. Gestion des erreurs
16.1.2. Scripts Python exécutables
16.1.3. Configuration du mode interactif
16.1.4. Modules de personnalisation
1. Mise en bouche
Lorsqu'on travaille beaucoup sur ordinateur, on finit souvent par vouloir automatiser
certaines tâches : par exemple, effectuer une recherche et un remplacement sur un
grand nombre de fichiers de texte ; ou renommer et réorganiser des photos d'une
manière un peu compliquée. Pour vous, ce peut être créer une petite base de
données, une application graphique ou un simple jeu.
Vous pouvez écrire un script shell Unix ou des fichiers batch Windows pour certaines
de ces tâches. Les scripts shell sont appropriés pour déplacer des fichiers et modifier
des données textuelles, mais pas pour une application ayant une interface graphique
ni pour des jeux. Vous pouvez écrire un programme en C/C++/Java, mais cela peut
prendre beaucoup de temps, ne serait-ce que pour avoir une première maquette.
Python est plus facile à utiliser et il vous aidera à terminer plus rapidement votre
travail, que ce soit sous Windows, Mac OS X ou Unix.
Python reste facile à utiliser, mais c'est un vrai langage de programmation : il offre
une bien meilleure structure et prise en charge des grands programmes que les
scripts shell ou les fichiers batch. Par ailleurs, Python permet de beaucoup mieux
vérifier les erreurs que le langage C et, en tant que langage de très haut niveau, il
possède nativement des types de données très évolués tels que les tableaux de
taille variable ou les dictionnaires. Grâce à ses types de données plus universels,
Python est utilisable pour des domaines beaucoup plus variés que ne peuvent
l'être Awk ou même Perl. Pourtant, vous pouvez faire de nombreuses choses au
moins aussi facilement en Python que dans ces langages.
Python vous permet de découper votre programme en modules qui peuvent être
réutilisés dans d'autres programmes Python. Il est fourni avec une grande variété de
modules standards que vous pouvez utiliser comme base de vos programmes, ou
comme exemples pour apprendre à programmer. Certains de ces modules donnent
accès aux entrées/sorties, aux appels système, aux connecteurs réseaux et même
aux outils comme Tk pour créer des interfaces graphiques.
Python est un langage interprété, ce qui peut vous faire gagner un temps
considérable pendant le développement de vos programmes car aucune compilation
ni édition de liens n'est nécessaire. L'interpréteur peut être utilisé de manière
interactive, pour vous permettre d'expérimenter les fonctionnalités du langage,
d'écrire des programmes jetables ou de tester des fonctions lors d'un développement
incrémental. C'est aussi une calculatrice de bureau bien pratique.
Python permet d'écrire des programmes compacts et lisibles. Les programmes écrits
en Python sont généralement beaucoup plus courts que leurs équivalents en C, C++
ou Java. Et ceci pour plusieurs raisons :
Maintenant que vos papilles ont été chatouillées, nous allons pouvoir rentrer dans le
vif du sujet Python. Et comme la meilleure façon d'apprendre un langage est de
l'utiliser, ce tutoriel vous invite à jouer avec l'interpréteur au fur et à mesure de votre
lecture.
python3.7
On Windows machines where you have installed Python from the Microsoft Store,
the python3.7 command will be available. If you have the py.exe launcher installed,
you can use the py command. See Digression : Définition des variables
d'environnement for other ways to launch Python.
L'interpréteur fonctionne de façon similaire au shell Unix : lorsqu'il est appelé avec
l'entrée standard connectée à un périphérique tty, il lit et exécute les commandes de
façon interactive ; lorsqu'il est appelé avec un nom de fichier en argument ou avec un
fichier comme entrée standard, il lit et exécute un script depuis ce fichier.
Une autre façon de lancer l'interpréteur est python -c commande [arg] ....
Cela exécute les instructions de commande de façon analogue à l'option -c du shell.
Parce que les instructions Python contiennent souvent des espaces et d'autres
caractères spéciaux pour le shell, il est généralement conseillé de
mettre commande entre guillemets simples.
Certains modules Python sont aussi utiles en tant que scripts. Ils peuvent être
appelés avec python -m module [arg] ... qui exécute le fichier source
de module comme si vous aviez tapé son nom complet dans la ligne de commande.
Quand un fichier de script est utilisé, il est parfois utile de pouvoir lancer le script puis
d'entrer dans le mode interactif après coup. Cela est possible en passant -i avant le
script.
2.1.1. Passage d'arguments
Lorsqu'ils sont connus de l'interpréteur, le nom du script et les arguments
additionnels sont représentés sous forme d'une liste assignée à la variable argv du
module sys. Vous pouvez y accéder en exécutant import sys. La liste contient au
minimum un élément ; quand aucun script ni aucun argument n'est
donné, sys.argv[0] est une chaine vide. Quand '-' (qui représente l'entrée
standard) est passé comme nom de script, sys.argv[0] contient '-'. Quand -
c commande est utilisé, sys.argv[0] contient '-c'. Enfin, quand -m module est
utilisé, le nom complet du module est assigné à sys.argv[0]. Les options trouvées
après -c commande ou -m module ne sont pas lues comme options de l'interpréteur
Python mais laissées dans sys.argv pour être utilisées par le module ou la
commande.
2.1.2. Mode interactif
Lorsque des commandes sont lues depuis un tty, l'interpréteur est dit être en mode
interactif. Dans ce mode, il demande la commande suivante avec le prompt primaire,
en général trois signes plus-grand-que ( >>>) ; pour les lignes de continuation, il
affiche le prompt secondaire, par défaut trois points ( ...). L'interpréteur affiche un
message de bienvenue indiquant son numéro de version et une notice de copyright
avant d'afficher le premier prompt :
$ python3.7
Python 3.7 (default, Sep 16 2015, 09:25:04)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more
information.
>>>
Les lignes de continuation sont nécessaires pour entrer une construction multi-lignes.
Par exemple, regardez cette instruction if :
>>>
#!/usr/bin/env python3
# -*- coding: cp1252 -*-
Notes
Sous Unix, par défaut, l'interpréteur Python 3.x n'est pas installé sous le nom
de python afin de ne pas entrer en conflit avec une éventuelle installation de Python
2.x.
Quelques exemples :
3.1.1. Les nombres
L'interpréteur agit comme une simple calculatrice : vous pouvez lui entrer une
expression et il vous affiche la valeur. La syntaxe des expressions est simple : les
opérateurs +, -, * et / fonctionnent comme dans la plupart des langages (par
exemple, Pascal ou C) ; les parenthèses peuvent être utilisées pour faire des
regroupements. Par exemple :
>>>
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5 # division always returns a floating point number
1.6
Les nombres entiers (comme 2, 4, 20) sont de type int, alors que les décimaux
(comme 5.0, 1.6) sont de type float. Vous trouvez plus de détails sur les types
numériques plus loin dans ce tutoriel.
>>>
>>>
>>> 5 ** 2 # 5 squared
25
>>> 2 ** 7 # 2 to the power of 7
128
Le signe égal (=) est utilisé pour affecter une valeur à une variable. Dans ce cas,
aucun résultat n'est affiché avant l'invite suivante :
>>>
>>> width = 20
>>> height = 5 * 9
>>> width * height
900
Si une variable n'est pas "définie" (si aucune valeur ne lui a été affectée), son
utilisation produit une erreur :
>>>
Les nombres à virgule flottante sont tout à fait admis (NdT : Python utilise le
point . comme séparateur entre la partie entière et la partie décimale des nombres,
c'est la convention anglo-saxonne) ; les opérateurs avec des opérandes de types
différents convertissent l'opérande de type entier en type virgule flottante :
>>>
>>> 4 * 3.75 - 1
14.0
En mode interactif, la dernière expression affichée est affectée à la variable _. Ainsi,
lorsque vous utilisez Python comme calculatrice, cela vous permet de continuer des
calculs facilement, par exemple :
>>>
Cette variable doit être considérée comme une variable en lecture seule par
l'utilisateur. Ne lui affectez pas de valeur explicitement --- vous créeriez ainsi une
variable locale indépendante, avec le même nom, qui masquerait la variable native et
son fonctionnement magique.
3.1.2. Chaînes de caractères
En plus des nombres, Python sait aussi manipuler des chaînes de caractères, qui
peuvent être exprimées de différentes manières. Elles peuvent être écrites entre
guillemets simples ('...') ou entre guillemets ("...") sans distinction 2. \ peut
être utilisé pour protéger un guillemet :
>>>
>>>
Si vous ne voulez pas que les caractères précédés d'un \ soient interprétés comme
étant spéciaux, utilisez les chaînes brutes (raw strings en anglais) en préfixant la
chaîne d'un r :
>>>
Les chaînes de caractères peuvent s'étendre sur plusieurs lignes. Utilisez alors des
triples guillemets, simples ou doubles : '''...''' ou """...""". Les retours à la
ligne sont automatiquement inclus, mais on peut l'empêcher en ajoutant \ à la fin de
la ligne. L'exemple suivant :
print("""\
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
""")
produit l'affichage suivant (notez que le premier retour à la ligne n'est pas inclus) :
>>>
>>>
Cette fonctionnalité est surtout intéressante pour couper des chaînes trop longues :
>>>
Cela ne fonctionne cependant qu'avec les chaînes littérales, pas avec les variables ni
les expressions :
>>>
Pour concaténer des variables, ou des variables avec des chaînes littérales, utilisez
l'opérateur + :
>>>
Les chaînes de caractères peuvent être indexées (i.e. on peut accéder aux
caractères par leur position), le premier caractère d'une chaîne étant à la position 0.
Il n'existe pas de type distinct pour les caractères, un caractère est simplement une
chaîne de longueur 1 :
>>>
Les indices peuvent également être négatifs, on compte alors en partant de la droite.
Par exemple :
>>>
En plus d'accéder à un élément par son indice, il est aussi possible de "trancher"
(slice en anglais) une chaîne. Accéder à une chaîne par un indice permet d'obtenir
un caractère, trancher permet d'obtenir une sous-chaîne :
>>>
>>>
Les valeurs par défaut des indices de tranches ont une utilité ; le premier indice vaut
zéro par défaut (i.e. lorsqu'il est omis), le deuxième correspond par défaut à la taille
de la chaîne de caractères
>>>
Pour mémoriser la façon dont les tranches fonctionnent, vous pouvez imaginer que
les indices pointent entre les caractères, le côté gauche du premier caractère ayant
la position 0. Le côté droit du dernier caractère d'une chaîne de n caractères a alors
pour indice n. Par exemple :
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
La première ligne de nombres donne la position des indices 0…6 dans la chaîne ; la
deuxième ligne donne l'indice négatif correspondant. La tranche de i à j est
constituée de tous les caractères situés entre les bords libellés i et j, respectivement.
Pour des indices non négatifs, la longueur d'une tranche est la différence entre ces
indices, si les deux sont entre les bornes. Par exemple, la longueur
de word[1:3] est 2.
Cependant, les indices hors bornes sont gérés silencieusement lorsqu'ils sont utilisés
dans des tranches :
>>>
>>> word[4:42]
'on'
>>> word[42:]
''
Les chaînes de caractères, en Python, ne peuvent pas être modifiées. On dit qu'elles
sont immuables. Affecter une nouvelle valeur à un indice dans une chaîne produit
une erreur :
>>>
Si vous avez besoin d'une chaîne différente, vous devez en créer une nouvelle :
>>>
>>>
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
Voir aussi
Type Séquence de Texte — str
Les chaînes de caractères sont des exemples de types séquences ; elles acceptent
donc les opérations classiques prises en charge par ces types.
Méthodes de chaînes de caractères
>>>
Comme les chaînes de caractères (et toute autre type de sequence), les listes
peuvent être indicées et découpées :
>>>
>>>
>>> squares[:]
[1, 4, 9, 16, 25]
>>>
Mais à la différence des chaînes qui sont immuables, les listes sont muables : il est
possible de modifier leur contenu :
>>>
Il est aussi possible d'ajouter de nouveaux éléments à la fin d'une liste avec la
méthode append() (les méthodes sont abordées plus tard) :
>>>
Des affectations de tranches sont également possibles, ce qui peut même modifier la
taille de la liste ou la vider complètement :
>>>
>>>
Il est possible d'imbriquer des listes (i.e. créer des listes contenant d'autres listes).
Par exemple :
>>>
>>>
>>>
>>> i = 256*256
>>> print('The value of i is', i)
The value of i is 65536
>>>
>>> a, b = 0, 1
>>> while a < 1000:
... print(a, end=',')
... a, b = b, a+b
...
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
Notes
>>>
4.2. L'instruction for
L'instruction for que propose Python est un peu différente de celle que l'on peut
trouver en C ou en Pascal. Au lieu de toujours itérer sur une suite arithmétique de
nombres (comme en Pascal), ou de donner à l'utilisateur la possibilité de définir le
pas d'itération et la condition de fin (comme en C), l'instruction for en Python itère
sur les éléments d'une séquence (qui peut être une liste, une chaîne de
caractères…), dans l'ordre dans lequel ils apparaissent dans la séquence. Par
exemple :
>>>
>>>
4.3. La fonction range()
Si vous devez itérer sur une suite de nombres, la fonction native range() est faite
pour cela. Elle génère des suites arithmétiques :
>>>
range(5, 10)
5, 6, 7, 8, 9
range(0, 10, 3)
0, 3, 6, 9
range(-10, -100, -30)
-10, -40, -70
Pour itérer sur les indices d'une séquence, on peut combiner les
fonctions range() et len() :
>>>
>>>
>>> print(range(10))
range(0, 10)
L'objet renvoyé par range() se comporte presque comme une liste, mais ce n'en est
pas une. Cet objet génère les éléments de la séquence au fur et à mesure de
l'itération, sans réellement produire la liste en tant que telle, économisant ainsi de
l'espace.
On appelle de tels objets des iterables, c'est à dire des objets qui conviennent à
des iterateurs, des fonctions ou constructions qui s'attendent à quelque chose duquel
ils peuvent tirer des éléments, successivement, jusqu'à épuisement. On a vu que
l'instruction for est un itérateur. La fonction list() en est un autre, qui crée des
listes à partir d'itérables :
>>>
>>> list(range(5))
[0, 1, 2, 3, 4]
Plus loin nous voyons d'autres fonctions qui donnent des itérables ou en prennent en
paramètre.
>>>
Lorsqu'elle utilisée dans une boucle, la clause else est donc plus proche de celle
associée à une instruction try que de celle associée à une instruction if : la
clause else d'une instruction try s'exécute lorsqu'aucune exception n'est
déclenchée, et celle d'une boucle lorsque aucun break n'intervient. Plus plus
d'informations sur l'instruction try et le traitement des exceptions, consultez Gestion
des exceptions.
L'instruction continue, également empruntée au C, fait passer la boucle à son
itération suivante :
>>>
4.5. L'instruction pass
L'instruction pass ne fait rien. Elle peut être utilisée lorsqu'une instruction est
nécessaire pour fournir une syntaxe correcte, mais qu'aucune action ne doit être
effectuée. Par exemple :
>>>
>>>
>>>
>>> def initlog(*args):
... pass # Remember to implement this!
...
>>>
La première instruction d'une fonction peut, de façon facultative, être une chaîne de
caractères littérale ; cette chaîne de caractères sera alors la chaîne de
documentation de la fonction, appelée docstring (consultez la section Chaînes de
documentation pour en savoir plus). Il existe des outils qui utilisent ces chaînes de
documentation pour générer automatiquement une documentation en ligne ou
imprimée, ou pour permettre à l'utilisateur de naviguer de façon interactive dans le
code ; prenez-en l'habitude, c'est une bonne pratique que de documenter le code
que vous écrivez.
L'exécution d'une fonction introduit une nouvelle table de symboles utilisée par les
variables locales de la fonction. Plus précisément, toutes les affectations de variables
effectuées au sein d'une fonction stockent la valeur dans la table de symboles
locale ; en revanche, les références de variables sont recherchées dans la table de
symboles locale, puis dans la table de symboles locale des fonctions englobantes,
puis dans la table de symboles globale et finalement dans la table de noms des
primitives. Par conséquent, bien qu'elles puissent être référencées, il est impossible
d'affecter une valeur à une variable globale ou à une variable d'une fonction
englobante (sauf pour les variables globales désignées dans une
instruction global et pour les variables des fonctions englobantes désignées dans
une instruction nonlocal).
Les paramètres effectifs (arguments) d'une fonction sont introduits dans la table de
symboles locale de la fonction appelée au moment où elle est appelée ; par
conséquent, les passages de paramètres se font par valeur, la valeur étant toujours
une référence à un objet et non la valeur de l'objet lui-même. 1 Lorsqu'une fonction
appelle une autre fonction, une nouvelle table de symboles locale est créée pour cet
appel.
>>>
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
Si vous venez d'autres langages, vous pouvez penser que fib n'est pas une
fonction mais une procédure, puisqu'elle ne renvoie pas de résultat. En fait, même
les fonctions sans instruction return renvoient une valeur, quoique ennuyeuse.
Cette valeur est appelée None (c'est le nom d'une primitive). Écrire la valeur None est
normalement supprimé par l'interpréteur lorsqu'il s'agit de la seule valeur qui doit être
écrite. Vous pouvez le constater, si vous y tenez vraiment, en utilisant print() :
>>>
>>> fib(0)
>>> print(fib(0))
None
Il est facile d'écrire une fonction qui renvoie une liste de la série de Fibonacci au lieu
de l'afficher :
>>>
Les valeurs par défaut sont évaluées lors de la définition de la fonction dans la
portée de définition, de telle sorte que
i = 5
def f(arg=i):
print(arg)
i = 6
f()
affiche 5.
Avertissement important : la valeur par défaut n'est évaluée qu'une seule fois. Ceci
fait une différence lorsque cette valeur par défaut est un objet muable tel qu'une liste,
un dictionnaire ou des instances de la plupart des classes. Par exemple, la fonction
suivante accumule les arguments qui lui sont passés au fil des appels successifs :
Ceci affiche
[1]
[1, 2]
[1, 2, 3]
Si vous ne voulez pas que cette valeur par défaut soit partagée entre des appels
successifs, vous pouvez écrire la fonction de cette façon :
parrot(1000) # 1
positional argument
parrot(voltage=1000) # 1 keyword
argument
parrot(voltage=1000000, action='VOOOOOM') # 2 keyword
arguments
parrot(action='VOOOOOM', voltage=1000000) # 2 keyword
arguments
parrot('a million', 'bereft of life', 'jump') # 3
positional arguments
parrot('a thousand', state='pushing up the daisies') # 1
positional, 1 keyword
Dans un appel de fonction, les arguments nommés doivent suivre les arguments
positionnés. Tous les arguments nommés doivent correspondre à l'un des arguments
acceptés par la fonction (par exemple, actor n'est pas un argument accepté par la
fonction parrot), mais leur ordre n'est pas important. Ceci inclut également les
arguments obligatoires (parrot(voltage=1000) est également correct). Aucun
argument ne peut recevoir une valeur plus d'une fois, comme l'illustre cet exemple
incorrect du fait de cette restriction :
>>>
Notez que Python garantit que l'ordre d'affichage des arguments est le même que
l'ordre dans lesquels ils sont fournis lors de l'appel à la fonction.
>>>
>>> def concat(*args, sep="/"):
... return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
>>>
>>>
>>>
L'exemple précédent utilise une fonction anonyme pour renvoyer une fonction. Une
autre utilisation classique est de donner une fonction minimaliste directement en tant
que paramètre :
>>>
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
4.7.6. Chaînes de documentation
Voici quelques conventions concernant le contenu et le format des chaînes de
documentation.
La première ligne devrait toujours être courte et résumer de manière concise l'utilité
de l'objet. Afin d'être bref, nul besoin de rappeler le nom de l'objet ou son type, qui
sont accessibles par d'autres moyens (sauf si le nom est un verbe qui décrit une
opération). Cette ligne devrait commencer avec une majuscule et se terminer par un
point.
S'il y a d'autres lignes dans la chaîne de documentation, la deuxième ligne devrait
être vide, pour la séparer visuellement du reste de la description. Les autres lignes
peuvent alors constituer un ou plusieurs paragraphes décrivant le mode d'utilisation
de l'objet, ses effets de bord, etc.
>>>
4.7.7. Annotations de fonctions
Les annotations de fonction sont des métadonnées optionnelles décrivant les types
utilisés par une fonction définie par l'utilisateur (voir les PEP 3107 et PEP 484 pour
plus d'informations).
>>>
En Python, la plupart des projets adhèrent au style défini dans la PEP 8 ; elle met en
avant un style de codage très lisible et agréable à l’œil. Chaque développeur Python
se doit donc de la lire et de s'en inspirer autant que possible ; voici ses principaux
points notables :
4 espaces constituent un bon compromis entre une indentation courte (qui permet
une profondeur d'imbrication plus importante) et une longue (qui rend le code plus
facile à lire). Les tabulations introduisent de la confusion et doivent être proscrites
autant que possible.
Faites en sorte que les lignes ne dépassent pas 79 caractères, au besoin en
insérant des retours à la ligne.
Vous facilitez ainsi la lecture pour les utilisateurs qui n'ont qu'un petit écran et, pour
les autres, cela leur permet de visualiser plusieurs fichiers côte à côte.
Utilisez des lignes vides pour séparer les fonctions et les classes, ou pour
scinder de gros blocs de code à l'intérieur de fonctions.
Lorsque c'est possible, placez les commentaires sur leurs propres lignes.
Utilisez les chaînes de documentation.
Utilisez des espaces autour des opérateurs et après les virgules, mais pas
juste à l'intérieur des parenthèses : a = f(1, 2) + g(3, 4).
Name your classes and functions consistently; the convention is to
use UpperCamelCase for classes and lowercase_with_underscores for
functions and methods. Always use self as the name for the first method argument
(see Une première approche des classes for more on classes and methods).
N'utilisez pas d'encodage exotique dès lors que votre code est censé être
utilisé dans des environnements internationaux. Par défaut, Python travaille en UTF-
8. Pour couvrir tous les cas, préférez le simple ASCII.
De la même manière, n'utilisez que des caractères ASCII pour vos noms de
variables s'il est envisageable qu'une personne parlant une autre langue lise ou
doive modifier votre code.
Notes
1 En fait, appels par référence d'objets serait sans doute une description plus juste dans la
mesure où, si un objet muable est passé en argument, l'appelant verra toutes les
modifications qui lui auront été apportées par l'appelé (insertion d'éléments dans une liste…).
5. Structures de données
Ce chapitre reprend plus en détail quelques points déjà décrits précédemment et
introduit également de nouvelles notions.
list.append(x)
list.extend(iterable)
list.remove(x)
Supprime de la liste le premier élément dont la valeur est égale à x. Une
exception ValueError est levée s'il n'existe aucun élément avec cette valeur.
list.pop([i])
list.clear()
list.index(x[, start[, end]])
list.count(x)
list.sort(key=None, reverse=False)
list.copy()
>>>
>>>
>>>
5.1.3. Compréhensions de listes
Les compréhensions de listes fournissent un moyen de construire des listes de
manière très concise. Une application classique est la construction de nouvelles
listes où chaque élément est le résultat d'une opération appliquée à chaque élément
d'une autre séquence ; ou de créer une sous-séquence des éléments satisfaisant
une condition spécifique.
Par exemple, supposons que l'on veuille créer une liste de carrés, comme :
>>>
>>> squares = []
>>> for x in range(10):
... squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Notez que cela crée (ou remplace) une variable nommée x qui existe toujours après
l'exécution de la boucle. On peut calculer une liste de carrés sans effet de bord
avec :
Une compréhension de liste consiste à placer entre crochets une expression suivie
par une clause for puis par zéro ou plus clauses for ou if. Le résultat est une
nouvelle liste résultat de l'évaluation de l'expression dans le contexte des
clauses for et if qui la suivent. Par exemple, cette compréhension de liste combine
les éléments de deux listes s'ils ne sont pas égaux :
>>>
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
>>>
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Notez que l'ordre des instructions for et if est le même dans ces différents extraits
de code.
>>>
>>>
>>>
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
>>>
>>>
>>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>>
>>> transposed = []
>>> for i in range(4):
... # the following 3 lines implement the nested listcomp
... transposed_row = []
... for row in matrix:
... transposed_row.append(row[i])
... transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Dans des cas concrets, il est toujours préférable d'utiliser des fonctions natives plutôt
que des instructions de contrôle de flux complexes. La fonction zip() ferait dans ce
cas un excellent travail :
>>>
>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
5.2. L'instruction del
Il existe un moyen de retirer un élément d'une liste à partir de sa position au lieu de
sa valeur : l'instruction del. Elle diffère de la méthode pop() qui, elle, renvoie une
valeur. L'instruction del peut également être utilisée pour supprimer des tranches
d'une liste ou la vider complètement (ce que nous avions fait auparavant en affectant
une liste vide à la tranche). Par exemple :
>>>
>>>
>>> del a
À partir de là, référencer le nom a est une erreur (au moins jusqu'à ce qu'une autre
valeur lui soit affectée). Vous trouverez d'autres utilisations de la fonction del plus
tard.
5.3. Tuples et séquences
Nous avons vu que les listes et les chaînes de caractères ont beaucoup de
propriétés en commun, comme l'indiçage et les opérations sur des tranches. Ce sont
deux exemples de séquences (voir Types séquentiels — list, tuple, range). Comme
Python est un langage en constante évolution, d'autres types de séquences y seront
peut-être ajoutés. Il existe également un autre type standard de séquence :
le tuple (ou n-uplet, dénomination que nous utiliserons dans la suite de cette
documentation).
Un n-uplet consiste en différentes valeurs séparées par des virgules, par exemple :
>>>
Comme vous pouvez le voir, les n-uplets sont toujours affichés entre parenthèses, de
façon à ce que des n-uplets imbriqués soient interprétés correctement ; ils peuvent
être saisis avec ou sans parenthèses, même si celles-ci sont souvent nécessaires
(notamment lorsqu'un n-uplet fait partie d'une expression plus longue). Il n'est pas
possible d'affecter de valeur à un élément d'un n-uplet ; par contre, il est possible de
créer des n-uplets contenant des objets muables, comme des listes.
Si les n-uplets peuvent sembler similaires aux listes, ils sont souvent utilisés dans
des cas différents et pour des raisons différentes. Les n-uplets sont immuables et
contiennent souvent des séquences hétérogènes d'éléments qui sont accédés par
« dissociation » (unpacking en anglais, voir plus loin) ou par indice (ou même par
attributs dans le cas des namedtuples). Les listes sont souvent muables et
contiennent des éléments généralement homogènes qui sont accédés par itération
sur la liste.
>>>
>>> empty = ()
>>> singleton = 'hello', # <-- note trailing comma
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)
>>> x, y, z = t
5.4. Ensembles
Python fournit également un type de donnée pour les ensembles. Un ensemble est
une collection non ordonnée sans élément dupliqué. Des utilisations basiques
concernent par exemple des tests d'appartenance ou des suppressions de doublons.
Les ensembles savent également effectuer les opérations mathématiques telles que
les unions, intersections, différences et différences symétriques.
>>>
>>>
5.5. Dictionnaires
Un autre type de donnée très utile, natif dans Python, est le dictionnaire (voir Les
types de correspondances — dict). Ces dictionnaires sont parfois présents dans
d'autres langages sous le nom de « mémoires associatives » ou de « tableaux
associatifs ». À la différence des séquences, qui sont indexées par des nombres, les
dictionnaires sont indexés par des clés, qui peuvent être de n'importe quel type
immuable ; les chaînes de caractères et les nombres peuvent toujours être des clés.
Des n-uplets peuvent être utilisés comme clés s'ils ne contiennent que des chaînes,
des nombres ou des n-uplets ; si un n-uplet contient un objet muable, de façon
directe ou indirecte, il ne peut pas être utilisé comme une clé. Vous ne pouvez pas
utiliser des listes comme clés, car les listes peuvent être modifiées en place en
utilisant des affectations par position, par tranches ou via des méthodes
comme append() ou extend().
Les opérations classiques sur un dictionnaire consistent à stocker une valeur pour
une clé et à extraire la valeur correspondant à une clé. Il est également possible de
supprimer une paire clé:valeur avec del. Si vous stockez une valeur pour une clé qui
est déjà utilisée, l'ancienne valeur associée à cette clé est perdue. Si vous tentez
d'extraire une valeur associée à une clé qui n'existe pas, une exception est levée.
>>>
>>>
De plus, il est possible de créer des dictionnaires par compréhension depuis un jeu
de clef et valeurs :
>>>
>>>
5.6. Techniques de boucles
Lorsque vous faites une boucle sur un dictionnaire, les clés et leurs valeurs peuvent
être récupérées en même temps en utilisant la méthode items() :
>>>
>>>
Pour faire des boucles sur deux séquences ou plus en même temps, les éléments
peuvent être associés par la fonction zip() :
>>>
Pour faire une boucle en sens inverse sur une séquence, commencez par spécifier la
séquence dans son ordre normal, puis appliquez la fonction reversed() :
>>>
>>>
Il est parfois tentant de modifier une liste pendant son itération. Cependant, c'est
souvent plus simple et plus sûr de créer une nouvelle liste à la place.
>>>
>>>
Comparer des objets de type différents avec < ou > est autorisé si les objets ont des
méthodes de comparaison appropriées. Par exemple, les types numériques sont
comparés via leur valeur numérique, donc 0 égale 0,0, etc. Dans les autres cas, au
lieu de donner un ordre imprévisible, l'interpréteur lève une exception TypeError.
Notes
1 D'autres langages renvoient l'objet modifié, ce qui permet de chaîner les méthodes comme
ceci : d->insert("a")->remove("b")->sort();.
6. Modules
Lorsque vous quittez et entrez à nouveau dans l'interpréteur Python, tout ce que
vous avez déclaré dans la session précédente est perdu. Afin de rédiger des
programmes plus longs, vous devez utiliser un éditeur de texte, préparer votre code
dans un fichier et exécuter Python avec ce fichier en paramètre. Cela s'appelle créer
un script. Lorsque votre programme grandit, vous pouvez séparer votre code dans
plusieurs fichiers. Ainsi, il vous est facile de réutiliser des fonctions écrites pour un
programme dans un autre sans avoir à les copier.
Pour gérer cela, Python vous permet de placer des définitions dans un fichier et de
les utiliser dans un script ou une session interactive. Un tel fichier est appelé
un module et les définitions d'un module peuvent être importées dans un autre
module ou dans le module main (qui est le module qui contient vos variables et
définitions lors de l'exécution d'un script au niveau le plus haut ou en mode interactif).
Un module est un fichier contenant des définitions et des instructions. Son nom de
fichier est le nom du module suffixé de .py. À l'intérieur d'un module, son propre
nom est accessible par la variable __name__. Par exemple, prenez votre éditeur
favori et créez un fichier fibo.py dans le répertoire courant qui contient :
>>>
Cela n'importe pas les noms des fonctions définies dans fibo directement dans la
table des symboles courants mais y ajoute simplement fibo. Vous pouvez donc
appeler les fonctions via le nom du module :
>>>
>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
Si vous avez l'intention d'utiliser souvent une fonction, il est possible de lui assigner
un nom local :
>>>
Des modules peuvent importer d'autres modules. Il est courant, mais pas obligatoire,
de ranger tous les import au début du module (ou du script). Les noms des
modules importés sont insérés dans la table des symboles globaux du module qui
importe.
>>>
Cela n'insère pas le nom du module depuis lequel les définitions sont récupérées
dans la table des symboles locaux (dans cet exemple, fibo n'est pas défini).
Il existe même une variante permettant d'importer tous les noms qu'un module
définit :
>>>
Tous les noms ne commençant pas par un tiret bas ( _) sont importés. Dans la
grande majorité des cas, les développeurs n'utilisent pas cette syntaxe puisqu'en
important un ensemble indéfini de noms, des noms déjà définis peuvent se retrouver
masqués.
Si le nom du module est suivi par as, alors le nom suivant as est directement lié au
module importé.
>>>
>>>
Note
pour des raisons de performance, chaque module n'est importé qu'une fois par
session. Si vous changez le code d'un module vous devez donc redémarrer
l'interpréteur afin d'en voir l'impact ; ou, s'il s'agit simplement d'un seul module que
vous voulez tester en mode interactif, vous pouvez le ré-importer explicitement en
utilisant importlib.reload(), par
exemple : import importlib; importlib.reload(nommodule).
if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))
vous pouvez rendre le fichier utilisable comme script aussi bien que comme module
importable, car le code qui analyse la ligne de commande n'est lancé que si le
module est exécuté comme fichier « main » :
$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34
>>>
C'est typiquement utilisé soit pour proposer une interface utilisateur pour un module,
soit pour lancer les tests sur le module (exécuter le module en tant que script lance
les tests).
6.1.2. Les dossiers de recherche de modules
Lorsqu'un module nommé par exemple spam est importé, il est d'abord recherché
parmi les modules natifs puis, s'il n'est pas trouvé, l'interpréteur cherche un fichier
nommé spam.py dans une liste de dossiers donnée par la variable sys.path. Par
défaut, sys.path est initialisée à :
Note
Sur les systèmes qui gèrent les liens symboliques, le dossier contenant le script
courant est résolu après avoir suivi le lien symbolique du script. Autrement dit, le
dossier contenant le lien symbolique n'est pas ajouté aux dossiers de recherche de
modules.
Après leur initialisation, les programmes Python peuvent modifier leur sys.path. Le
dossier contenant le script courant est placé au début de la liste des dossiers à
rechercher, avant les dossiers de bibliothèques. Cela signifie qu'un module dans ce
dossier, ayant le même nom qu'un module, sera chargé à sa place. C'est une erreur
typique, à moins que ce ne soit voulu. Voir Modules standards pour plus
d'informations.
6.2. Modules standards
Python est accompagné d'une bibliothèque de modules standards, décrits dans la
documentation de la Bibliothèque Python, plus loin. Certains modules sont intégrés
dans l'interpréteur, ils exposent des outils qui ne font pas partie du langage mais qui
font tout de même partie de l'interpréteur, soit pour le côté pratique, soit pour exposer
des outils essentiels tels que l'accès aux appels système. La composition de ces
modules est configurable à la compilation et dépend aussi de la plateforme cible. Par
exemple, le module winreg n'est proposé que sur les systèmes Windows. Un
module mérite une attention particulière, le module sys, qui est présent dans tous les
interpréteurs Python. Les variables sys.ps1 et sys.ps2 définissent les chaînes
d'invites principales et secondaires :
>>>
Ces deux variables ne sont définies que si l'interpréteur est en mode interactif.
>>>
6.3. La fonction dir()
La fonction interne dir() est utilisée pour trouver quels noms sont définis par un
module. Elle donne une liste de chaînes classées par ordre lexicographique :
>>>
>>>
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
Notez qu'elle liste tous les types de noms : les variables, fonctions, modules, etc.
dir() ne liste ni les fonctions primitives, ni les variables internes. Si vous voulez les
lister, elles sont définies dans le module builtins :
>>>
Lorsqu'il importe des paquets, Python cherche dans chaque dossier de sys.path un
sous-dossier du nom du paquet.
import sound.effects.echo
Au contraire, en utilisant la
syntaxe import element.souselement.soussouselement,
chaque element sauf le dernier doit être un paquet. Le dernier element peut être
un module ou un paquet, mais ne peut être ni une fonction, ni une classe, ni une
variable définie dans l'élément précédent.
6.4.1. Importer * depuis un paquet
Qu'arrive-t-il lorsqu'un utilisateur écrit from sound.effects import * ?
Idéalement, on pourrait espérer que Python aille chercher tous les sous-modules du
paquet sur le système de fichiers et qu'ils seraient tous importés. Cela pourrait être
long et importer certains sous-modules pourrait avoir des effets secondaires
indésirables ou, du moins, désirés seulement lorsque le sous-module est importé
explicitement.
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
Notez que les importations relatives se fient au nom du module actuel. Puisque le
nom du module principal est toujours "__main__", les modules utilisés par le
module principal d'une application ne peuvent être importés que par des importations
absolues.
Bien que cette fonctionnalité ne soit que rarement utile, elle peut servir à élargir la
liste des modules trouvés dans un paquet.
Notes
En réalité, la déclaration d'une fonction est elle-même une instruction ; son exécution
enregistre le nom de la fonction dans la table des symboles globaux du module.
7. Les entrées/sorties
Il existe bien des moyens de présenter les sorties d'un programmes ; les données
peuvent être affichées sous une forme lisible par un être humain ou sauvegardées
dans un fichier pour une utilisation future. Ce chapitre présente quelques possibilités.
7.1. Formatage de données
Jusqu'ici, nous avons rencontré deux moyens d'écrire des données : les déclarations
d'expressions et la fonction print(). Une troisième méthode consiste à utiliser la
méthode write() des fichiers, avec le fichier de sortie standard référencé en tant
que sys.stdout. Voyez le Guide de Référence de la Bibliothèque Standard pour en
savoir plus.
Souvent vous voudrez plus de contrôle sur le formatage de vos sorties et aller au
delà d’un affichage de valeurs séparées par des espaces. Il y a plusieurs moyens de
les formater.
>>>
Lorsque qu'un affichage basique suffit, pour afficher simplement une variable pour en
inspecter le contenu, vous pouvez convertir n'importe quelle valeur en chaîne de
caractères en utilisant la fonction repr() ou la fonction str().
La fonction str() est destinée à représenter les valeurs sous une forme lisible par un
être humain, alors que la fonction repr() est destinée à générer des représentations
qui puissent être lues par l'interpréteur (ou qui lèvera une SyntaxError s'il n'existe
aucune syntaxe équivalente). Pour les objets qui n'ont pas de représentation
humaine spécifique, str() renvoie la même valeur que repr(). Beaucoup de valeurs,
comme les nombres ou les structures telles que les listes ou les dictionnaires, ont la
même représentation en utilisant les deux fonctions. Les chaînes de caractères, en
particulier, ont deux représentations distinctes.
Quelques exemples :
>>>
L'expression peut être suivie d'un spécificateur de format. Cela permet un plus grand
contrôle sur la façon dont la valeur est rendue. L'exemple suivant arrondit pi à trois
décimales après la virgule :
>>>
>>>
D’autres modificateurs peuvent être utilisés pour convertir la valeur avant son
formatage. '!a' applique ascii(), '!s' applique str(), et '!r' applique repr() :
>>>
>>> animals = 'eels'
>>> print(f'My hovercraft is full of {animals}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of {animals!r}.')
My hovercraft is full of 'eels'.
Pour une référence sur ces spécifications de formats, voir le guide de référence pour
les Mini-langage de spécification de format.
>>>
Les accolades et les caractères à l'intérieur (appelés les champs de formatage) sont
remplacés par les objets passés en paramètres à la méthode str.format(). Un nombre
entre accolades se réfère à la position de l'objet passé à la méthode str.format().
>>>
>>>
>>>
If you have a really long format string that you don't want to split up, it would be nice
if you could reference the variables to be formatted by name instead of by position.
This can be done by simply passing the dict and using square brackets '[]' to access
the keys.
>>>
Vous pouvez obtenir le même résultat en passant le tableau comme des arguments
nommés en utilisant la notation **
>>>
>>>
Pour avoir une description complète du formatage des chaînes de caractères avec la
méthode str.format(), lisez : Syntaxe de formatage de chaîne.
>>>
Il existe une autre méthode, str.zfill(), qui comble une chaîne numérique à gauche
avec des zéros. Elle comprend les signes plus et moins :
>>>
>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
>>>
>>>
Normalement, les fichiers sont ouverts en mode texte, c'est-à-dire que vous lisez et
écrivez des chaînes de caractères depuis et dans ce fichier, suivant un encodage
donné. Si aucun encodage n'est spécifié, l'encodage par défaut dépend de la
plateforme (voir open()). 'b' collé à la fin du mode indique que le fichier doit être ouvert
en mode binaire c'est-à-dire que les données sont lues et écrites sous formes
d'octets (type bytes). Ce mode est à utiliser pour les fichiers contenant autre chose
que du texte.
En mode texte, le comportement par défaut, à la lecture, est de convertir les fin de
lignes spécifiques à la plateforme (\n sur Unix, \r\n sur Windows etc...) en simples \n.
Lors de l'écriture, le comportement par défaut est d'appliquer l'opération inverse :
les \n sont convertis dans leur équivalent sur la plateforme courante. Ces
modifications effectuées automatiquement sont normales pour du texte mais
détérioreraient des données binaires contenues dans un fichier de type JPEG ou EXE.
Soyez particulièrement attentifs à ouvrir ces fichiers binaires en mode binaire.
C'est une bonne pratique d'utiliser le mot-clé with lorsque vous traitez des fichiers.
Vous fermez ainsi toujours correctement le fichier, même si une exception est levée.
Utiliser with est aussi beaucoup plus court que d'utiliser l'équivalent avec des
blocs try-finally :
>>>
>>>
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
7.2.1. Méthodes des objets fichiers
Les derniers exemples de cette section supposent qu'un objet fichier appelé f a déjà
été créé.
To read a file's contents, call f.read(size), which reads some quantity of data and
returns it as a string (in text mode) or bytes object (in binary mode). size is an
optional numeric argument. When size is omitted or negative, the entire contents of
the file will be read and returned; it's your problem if the file is twice as large as your
machine's memory. Otherwise, at most size characters (in text mode) or size bytes
(in binary mode) are read and returned. If the end of the file has been
reached, f.read() will return an empty string ('').
>>>
>>> f.read()
'This is the entire file.\n'
>>> f.read()
''
f.readline() lit une seule ligne du fichier ; un caractère de fin de ligne ( \n) est laissé à la
fin de la chaîne. Il n'est omis que sur la dernière ligne du fichier si celui-ci ne se
termine pas un caractère de fin de ligne. Ceci permet de rendre la valeur de retour
non ambigüe : si f.readline() renvoie une chaîne vide, c'est que la fin du fichier a été
atteinte, alors qu'une ligne vide est représentée par '\n' (une chaîne de caractères ne
contenant qu'une fin de ligne).
>>>
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''
Pour lire ligne à ligne, vous pouvez aussi boucler sur l'objet fichier. C'est plus efficace
en terme de gestion mémoire, plus rapide et donne un code plus simple :
>>>
Pour construire une liste avec toutes les lignes d'un fichier, il est aussi possible
d'utiliser list(f) ou f.readlines().
>>>
Les autres types doivent être convertis, soit en une chaîne (en mode texte), soit en
objet bytes (en mode binaire) avant de les écrire :
>>>
>>>
Sur un fichier en mode texte (ceux ouverts sans b dans le mode), seuls les
changements de position relatifs au début du fichier sont autorisés (sauf une
exception : se rendre à la fin du fichier avec seek(0, 2)) et les seules valeurs
possibles pour le paramètre decalage sont les valeurs renvoyées par f.tell(), ou zéro.
Toute autre valeur pour le paramètre decalage produit un comportement indéfini.
Note
Le format JSON est couramment utilisé dans les applications modernes pour
échanger des données. Beaucoup de développeurs le maîtrise, ce qui en fait un
format de prédilection pour l'interopérabilité.
json.dump(x, f)
x = json.load(f)
Cette méthode de sérialisation peut sérialiser des listes et des dictionnaires. Mais
sérialiser d'autres types de données requiert un peu plus de travail. La
documentation du module json explique comment faire.
Voir aussi
Le module pickle
8. Erreurs et exceptions
Jusqu'ici, les messages d'erreurs ont seulement été mentionnés. Mais si vous avez
essayé les exemples vous avez certainement vu plus que cela. En fait, il y a au
moins deux types d'erreurs à distinguer : les erreurs de syntaxe et les exceptions.
8.1. Les erreurs de syntaxe
Les erreurs de syntaxe, qui sont des erreurs d'analyse du code, sont peut-être celles
que vous rencontrez le plus souvent lorsque vous êtes encore en phase
d'apprentissage de Python :
>>>
L'analyseur indique la ligne incriminée et affiche une petite « flèche » pointant vers le
premier endroit de la ligne où l'erreur a été détectée. L'erreur est causée (ou, au
moins, a été détectée comme telle) par le symbole placé avant la flèche. Dans cet
exemple la flèche est sur la fonction print() car il manque deux points (':') juste
avant. Le nom du fichier et le numéro de ligne sont affichés pour vous permettre de
localiser facilement l'erreur lorsque le code provient d'un script.
8.2. Exceptions
Même si une instruction ou une expression est syntaxiquement correcte, elle peut
générer une erreur lors de son exécution. Les erreurs détectées durant l'exécution
sont appelées des exceptions et ne sont pas toujours fatales : nous apprendrons
bientôt comment les traiter dans vos programmes. La plupart des exceptions
toutefois ne sont pas prises en charge par les programmes, ce qui génère des
messages d'erreurs comme celui-ci :
>>>
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
La dernière ligne du message d'erreur indique ce qui s'est passé. Les exceptions
peuvent être de différents types et ce type est indiqué dans le message : les types
indiqués dans l'exemple sont ZeroDivisionError, NameError et TypeError. Le
texte affiché comme type de l'exception est le nom de l'exception native qui a été
déclenchée. Ceci est vrai pour toutes les exceptions natives mais n'est pas une
obligation pour les exceptions définies par l'utilisateur (même si c'est une convention
bien pratique). Les noms des exceptions standards sont des identifiants natifs (pas
des mots-clef réservés).
>>>
Une classe dans une clause except est compatible avec une exception si elle est de
la même classe ou d'une de ses classes dérivées. Mais l'inverse n'est pas vrai, une
clause except spécifiant une classe dérivée n'est pas compatible avec une classe
de base. Par exemple, le code suivant affiche B, C et D dans cet ordre :
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
Quand une exception intervient, une valeur peut lui être associée, que l'on
appelle l'argument de l'exception. La présence de cet argument et son type
dépendent du type de l'exception.
La clause except peut spécifier un nom de variable après le nom de l'exception.
Cette variable est liée à une instance d'exception avec les arguments stockés
dans instance.args. Pour plus de commodité, l'instance de l'exception définit la
méthode __str__() afin que les arguments puissent être affichés directement sans
avoir à référencer .args. Il est possible de construire une exception, y ajouter ses
attributs, puis la lever plus tard.
>>>
>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print(type(inst)) # the exception instance
... print(inst.args) # arguments stored in .args
... print(inst) # __str__ allows args to be printed
directly,
... # but may be overridden in exception
subclasses
... x, y = inst.args # unpack args
... print('x =', x)
... print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
Les gestionnaires d'exceptions n'interceptent pas que les exceptions qui sont levées
immédiatement dans leur clause try, mais aussi celles qui sont levées au sein de
fonctions appelées (parfois indirectement) dans la clause try. Par exemple :
>>>
>>>
Le seul argument à raise indique l'exception à déclencher. Cela peut être soit une
instance d'exception, soit une classe d'exception (une classe dérivée
de Exception). Si une classe est donnée, elle est implicitement
instanciée via l'appel de son constructeur, sans argument :
Si vous avez besoin de savoir si une exception a été levée mais que vous n'avez pas
intention de la gérer, une forme plus simple de l'instruction raise permet de
propager l'exception :
>>>
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
NameError: HiThere
class Error(Exception):
"""Base class for exceptions in this module."""
pass
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error
occurred
message -- explanation of the error
"""
class TransitionError(Error):
"""Raised when an operation attempts a state transition
that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is
not allowed
"""
La plupart des exceptions sont définies avec des noms qui se terminent par "Error",
comme les exceptions standards.
Beaucoup de modules standards définissent leurs propres exceptions pour signaler
les erreurs possibles dans les fonctions qu'ils définissent. Plus d'informations sur les
classes sont présentées dans le chapitre Classes.
>>>
>>> try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
...
Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
For example:
>>>
>>>
Comme vous pouvez le voir, la clause finally est exécutée dans tous les cas.
L'exception de type TypeError, déclenchée en divisant deux chaînes de caractères,
n'est pas prise en charge par la clause except et est donc propagée après que la
clause finally a été exécutée.
Dans les vraies applications, la clause finally est notamment utile pour libérer des
ressources externes (telles que des fichiers ou des connexions réseau), quelle qu'ait
été l'utilisation de ces ressources.
8.7. Actions de nettoyage prédéfinies
Certains objets définissent des actions de nettoyage standards qui doivent être
exécutées lorsque l'objet n'est plus nécessaire, indépendamment du fait que
l'opération ayant utilisé l'objet ait réussi ou non. Regardez l'exemple suivant, qui
tente d'ouvrir un fichier et d'afficher son contenu à l'écran :
Le problème avec ce code est qu'il laisse le fichier ouvert pendant une durée
indéterminée après que le code a fini de s'exécuter. Ce n'est pas un problème avec
des scripts simples, mais peut l'être au sein d'applications plus conséquentes.
L'instruction with permet d'utiliser certains objets comme des fichiers d'une façon
qui assure qu'ils seront toujours nettoyés rapidement et correctement.
with open("myfile.txt") as f:
for line in f:
print(line, end="")
9. Classes
Les classes sont un moyen de réunir des données et des fonctionnalités. Créer une
nouvelle classe crée un nouveau type d'objet et ainsi de nouvelles instances de ce
type peuvent être construites. Chaque instance peut avoir ses propres attributs, ce
qui définit son état. Une instance peut aussi avoir des méthodes (définies par la
classe de l'instance) pour modifier son état.
Dans la terminologie C++, les membres des classes (y compris les données)
sont publics (sauf exception, voir Variables privées) et toutes les fonctions membres
sont virtuelles. Comme avec Modula-3, il n'y a aucune façon d'accéder aux membres
d'un objet à partir de ses méthodes : une méthode est déclarée avec un premier
argument explicite représentant l'objet et cet argument est transmis de manière
implicite lors de l'appel. Comme avec Smalltalk, les classes elles-mêmes sont des
objets. Il existe ainsi une sémantique pour les importer et les renommer. Au contraire
de C++ et Modula-3, les types natifs peuvent être utilisés comme classes de base
pour être étendus par l'utilisateur. Enfin, comme en C++, la plupart des opérateurs
natifs avec une syntaxe spéciale (opérateurs arithmétiques, indiçage, etc.) peuvent
être redéfinis pour les instances de classes.
Les attributs peuvent être en lecture seule ou modifiables. S'ils sont modifiables,
l'affectation à un attribut est possible. Les attributs de modules sont modifiables :
vous pouvez écrire nommodule.la_reponse = 42. Les attributs modifiables
peuvent aussi être effacés avec l'instruction del. Par
exemple, del nommodule.la_reponse supprime l'attribut la_reponse de l'objet
nommé nommodule.
Les espaces de nommage sont créés à différents moments et ont différentes durées
de vie. L'espace de nommage contenant les primitives est créé au démarrage de
l'interpréteur Python et n'est jamais effacé. L'espace de nommage globaux pour un
module est créé lorsque la définition du module est lue. Habituellement, les espaces
de nommage des modules durent aussi jusqu'à l'arrêt de l'interpréteur. Les
instructions exécutées par la première invocation de l'interpréteur, qu'elles soient
lues depuis un fichier de script ou de manière interactive, sont considérées comme
faisant partie d'un module appelé __main__, de façon qu'elles possèdent leur propre
espace de nommage (les primitives vivent elles-mêmes dans un module,
appelé builtins).
L'espace des noms locaux d'une fonction est créé lors de son appel, puis effacé
lorsqu'elle renvoie un résultat ou lève une exception non prise en charge (en fait,
« oublié » serait une meilleure façon de décrire ce qui se passe réellement). Bien
sûr, des invocations récursives ont chacune leur propre espace de nommage.
Bien que les portées soient déterminées de manière statique, elles sont utilisées de
manière dynamique. À n'importe quel moment de l'exécution, il y a au minimum trois
portées imbriquées dont les espaces de nommage sont directement accessibles :
la portée la plus au centre, celle qui est consultée en premier, contient les
noms locaux ;
les portées des fonctions englobantes, qui sont consultées en commençant
avec la portée englobante la plus proche, contiennent des noms non-locaux mais
aussi non-globaux ;
l'avant-dernière portée contient les noms globaux du module courant ;
la portée englobante, consultée en dernier, est l'espace de nommage
contenant les primitives.
Si un nom est déclaré comme global, alors toutes les références et affectations vont
directement dans la portée intermédiaire contenant les noms globaux du module.
Pour pointer une variable qui se trouve en dehors de la portée la plus locale, vous
pouvez utiliser l'instruction nonlocal. Si une telle variable n'est pas
déclarée nonlocal, elle est en lecture seule (toute tentative de la modifier crée
simplement une nouvelle variable dans la portée la plus locale, en laissant inchangée
la variable du même nom dans sa portée d'origine).
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
scope_test()
print("In global scope:", spam)
Vous pouvez constater que l'affectation locale (qui est effectuée par défaut) n'a pas
modifié la liaison de spam dans scope_test. L'affectation nonlocal a changé la
liaison de spam dans scope_test et l'affectation global a changé la liaison au
niveau du module.
Vous pouvez également voir qu'aucune liaison pour spam n'a été faite avant
l'affectation global.
class ClassName:
<statement-1>
.
.
.
<statement-N>
Quand une classe est définie, un nouvel espace de nommage est créé et utilisé
comme portée locale --- Ainsi, toutes les affectations de variables locales entrent
dans ce nouvel espace de nommage. En particulier, les définitions de fonctions y
lient le nom de la nouvelle fonction.
À la fin de la définition d'une classe, un objet classe est créé. C'est, pour simplifier,
une encapsulation du contenu de l'espace de nommage créé par la définition de
classe. Nous revoyons les objets classes dans la prochaine section. La portée locale
initiale (celle qui prévaut avant le début de la définition de la classe) est ré-instanciée
et l'objet de classe est lié ici au nom de classe donné dans l'en-tête de définition de
classe (ClassName dans l'exemple).
9.3.2. Objets classes
Les objets classes prennent en charge deux types d'opérations : des références à
des attributs et l'instanciation.
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
x = MyClass()
def __init__(self):
self.data = []
x = MyClass()
Bien sûr, la méthode __init__() peut avoir des arguments pour une plus grande
flexibilité. Dans ce cas, les arguments donnés à l'opérateur d'instanciation de classe
sont transmis à __init__(). Par exemple
>>>
9.3.3. Objets instances
Now what can we do with instance objects? The only operations understood by
instance objects are attribute references. There are two kinds of valid attribute
names: data attributes and methods.
Les attributs 'données' correspondent à des "variables d'instance" en Smalltalk et
aux "membres de données" en C++. Les attributs 'données' n'ont pas à être
déclarés. Comme les variables locales, ils existent dès lors qu'ils sont assignés une
première fois. Par exemple, si x est l'instance de MyClass créée ci-dessus, le code
suivant affiche la valeur 16, sans laisser de trace :
x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print(x.counter)
del x.counter
L'autre type de référence à un attribut d'instance est une méthode. Une méthode est
une fonction qui "appartient à" un objet (en Python, le terme de méthode n'est pas
unique aux instances de classes : d'autres types d'objets peuvent aussi avoir des
méthodes. Par exemple, les objets listes ont des méthodes
appelées append, insert, remove, sort et ainsi de suite. Toutefois, dans la
discussion qui suit, sauf indication contraire, nous utilisons le terme de méthode
exclusivement en référence à des méthodes d'objets instances de classe).
Les noms de méthodes valides d'un objet instance dépendent de sa classe. Par
définition, tous les attributs d'une classe qui sont des objets fonctions définissent les
méthodes correspondantes de ses instances. Donc, dans notre exemple, x.f est
une référence valide à une méthode car MyClass.f est une fonction, mais
pas x.i car MyClass.i n'en est pas une. Attention cependant, x.f n'est pas la
même chose que MyClass.f --- Il s'agit d'un objet méthode, pas d'un objet fonction.
9.3.4. Objets méthode
Le plus souvent, une méthode est appelée juste après avoir été liée :
x.f()
xf = x.f
while True:
print(xf())
affiche hello world jusqu'à la fin des temps.
Que se passe-t-il exactement quand une méthode est appelée ? Vous avez dû
remarquer que x.f() a été appelée dans le code ci-dessus sans argument, alors
que la définition de la méthode f() spécifie bien qu'elle prend un argument. Qu'est-il
arrivé à l'argument ? Python doit sûrement lever une exception lorsqu'une fonction
qui requiert un argument est appelée sans -- même si l'argument n'est pas utilisé…
En fait, vous avez peut-être deviné la réponse : la particularité des méthodes est que
l'objet est passé comme premier argument de la fonction. Dans notre exemple,
l'appel x.f() est exactement équivalent à MyClass.f(x). En général, appeler une
méthode avec une liste de n arguments est équivalent à appeler la fonction
correspondante avec une liste d'arguments créée en ajoutant l'instance de l'objet de
la méthode avant le premier argument.
class Dog:
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind # shared by all dogs
'canine'
>>> e.kind # shared by all dogs
'canine'
>>> d.name # unique to d
'Fido'
>>> e.name # unique to e
'Buddy'
class Dog:
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks # unexpectedly shared by all dogs
['roll over', 'play dead']
Une conception correcte de la classe est d'utiliser une variable d'instance à la place :
class Dog:
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks
['roll over']
>>> e.tricks
['play dead']
9.4. Remarques diverses
Les attributs 'données' surchargent les méthodes avec le même nom ; pour éviter
des conflits de nommage, qui peuvent causer des bugs difficiles à trouver dans de
grands programmes, il est sage d'adopter certaines conventions qui minimisent les
risques de conflits. Parmi les conventions possibles, on peut citer la mise en
majuscule des noms de méthodes, le préfixe des noms d'attributs 'données' par une
chaîne courte et unique (parfois juste la caractère souligné) ou l'utilisation de verbes
pour les méthodes et de noms pour les attributs 'données'.
Les attributs 'données' peuvent être référencés par des méthodes comme par des
utilisateurs ordinaires ("clients") d'un objet. En d'autres termes, les classes ne sont
pas utilisables pour implémenter des types de données purement abstraits. En fait, il
n'est pas possible en Python d'imposer de masquer des données — tout est basé sur
des conventions (d'un autre côté, l'implémentation de Python, écrite en C, peut
complètement masquer les détails d'implémentation et contrôler l'accès à un objet si
nécessaire ; ceci peut être utilisé par des extensions de Python écrites en C).
Les clients doivent utiliser les attributs 'données' avec précaution --- ils pourraient
mettre le désordre dans les invariants gérés par les méthodes avec leurs propres
valeurs d'attributs. Remarquez que les clients peuvent ajouter leurs propres attributs
'données' à une instance d'objet sans altérer la validité des méthodes, pour autant
que les noms n'entrent pas en conflit --- là aussi, adopter une convention de
nommage peut éviter bien des problèmes.
Il n'y a pas de notation abrégée pour référencer des attributs 'données' (ou les autres
méthodes !) depuis les méthodes. Nous pensons que ceci améliore en fait la lisibilité
des méthodes : il n'y a aucune chance de confondre variables locales et variables
d'instances quand on regarde le code d'une méthode.
class C:
f = f1
def g(self):
return 'hello world'
h = g
Les méthodes peuvent appeler d'autres méthodes en utilisant des méthodes qui sont
des attributs de l'argument self :
class Bag:
def __init__(self):
self.data = []
Les méthodes peuvent faire référence à des noms globaux de la même manière que
les fonctions. La portée globale associée à une méthode est le module contenant la
définition de la classe (la classe elle-même n'est jamais utilisée en tant que portée
globale). Alors qu'il est rare d'avoir une bonne raison d'utiliser des données globales
dans une méthode, il y a de nombreuses utilisations légitimes de la portée globale :
par exemple, les fonctions et modules importés dans une portée globale peuvent être
utilisés par des méthodes, de même que les fonctions et classes définies dans cette
même portée. Habituellement, la classe contenant la méthode est elle-même définie
dans cette portée globale et, dans la section suivante, nous verrons de bonnes
raisons pour qu'une méthode référence sa propre classe.
Toute valeur est un objet et a donc une classe (appelée aussi son type). Elle est
stockée dans objet.__class__.
9.5. Héritage
Bien sûr, ce terme de "classe" ne serait pas utilisé s'il n'y avait pas d'héritage. La
syntaxe pour définir une sous-classe est de cette forme :
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
class DerivedClassName(modname.BaseClassName):
L'exécution d'une définition de classe dérivée se déroule comme pour une classe de
base. Quand l'objet de la classe est construit, la classe de base est mémorisée. Elle
est utilisée pour la résolution des références d'attributs : si un attribut n'est pas trouvé
dans la classe, la recherche se poursuit en regardant dans la classe de base. Cette
règle est appliquée récursivement si la classe de base est elle-même dérivée d'une
autre classe.
Les classes dérivées peuvent surcharger des méthodes de leurs classes de base.
Comme les méthodes n'ont aucun privilège particulier quand elles appellent d'autres
méthodes d'un même objet, une méthode d'une classe de base qui appelle une autre
méthode définie dans la même classe peut en fait appeler une méthode d'une classe
dérivée qui la surcharge (pour les programmeurs C++ : toutes les méthodes de
Python sont en effet "virtuelles").
Une méthode dans une classe dérivée peut aussi, en fait, vouloir étendre plutôt que
simplement remplacer la méthode du même nom de sa classe de base. L'appel
direct à la méthode de la classe de base s'écrit
simplement BaseClassName.nomMethode(self, arguments). C'est parfois utile
également aux clients (notez bien que ceci ne fonctionne que si la classe de base est
accessible en tant que BaseClassName dans la portée globale).
9.5.1. Héritage multiple
Python gère également une forme d'héritage multiple. Une définition de classe ayant
plusieurs classes de base est de cette forme :
Dans la plupart des cas, vous pouvez vous représenter la recherche d'attributs dans
les classes parentes comme étant : le plus profond d'abord, de gauche à droite, sans
chercher deux fois dans la même classe si elle apparaît plusieurs fois dans la
hiérarchie. Ainsi, si un attribut n'est pas trouvé dans DerivedClassName, il est
recherché dans Base1, puis (récursivement) dans les classes de base de Base1 ; s'il
n'y est pas trouvé, il est recherché dans Base2 et ses classes de base, et ainsi de
suite.
Dans les faits, c'est un peu plus complexe que ça ; l'ordre de la recherche (method
resolution order, ou MRO en anglais) change dynamiquement pour gérer des appels
coopératifs à super(). Cette approche est connue sous le nom de la "appel de la
méthode la plus proche" (call-next-method en anglais) dans d'autres langages avec
héritage multiple. Elle est plus puissante que le simple appel à super que l'on trouve
dans les langages à héritage simple.
L'ordre défini dynamiquement est nécessaire car tous les cas d'héritage multiple
comportent une ou plusieurs relations en losange (où au moins une classe peut être
accédée à partir de plusieurs chemins en partant de la classe la plus basse). Par
exemple, puisque toutes les classes héritent de object, tout héritage multiple ouvre
plusieurs chemins pour atteindre object. Pour qu'une classe de base ne soit pas
appelée plusieurs fois, l'algorithme dynamique linéarise l'ordre de recherche d'une
façon qui préserve l'ordre d'héritage, de la gauche vers la droite, spécifié dans
chaque classe, qui appelle chaque classe parente une seule fois, qui est monotone
(ce qui signifie qu'une classe peut être sous-classée sans affecter l'ordre d'héritage
de ses parents). Prises ensemble, ces propriétés permettent de concevoir des
classes de façon fiable et extensible dans un contexte d'héritage multiple. Pour plus
de détails, consultez http://www.python.org/download/releases/2.3/mro/.
9.6. Variables privées
Les membres "privés", qui ne peuvent être accédés que depuis l'intérieur d'un objet,
n'existent pas en Python. Toutefois, il existe une convention respectée par la majorité
du code Python : un nom préfixé par un tiret bas (comme _spam) doit être considéré
comme une partie non publique de l'API (qu'il s'agisse d'une fonction, d'une méthode
ou d'un attribut 'données'). Il doit être vu comme un détail d'implémentation pouvant
faire l'objet de modifications futures sans préavis.
Dès lors qu'il y a un cas d'utilisation valable pour avoir des attributs privés aux
classes (notamment pour éviter des conflits avec des noms définis dans des sous-
classes), il existe un support (certes limité) pour un tel mécanisme, appelé name
mangling. Tout identifiant de la forme __spam (avec au moins deux tirets bas en tête
et au plus un à la fin) est remplacé textuellement par _classname__spam,
où classname est le nom de la classe sans le ou les premiers tirets-bas. Ce
"découpage" est effectué sans tenir compte de la position syntaxique de l'identifiant,
tant qu'il est présent dans la définition d'une classe.
class MappingSubclass(Mapping):
Notez que ces règles sont conçues avant tout pour éviter les accidents ; il reste
possible d'accéder ou de modifier une variable considérée comme privée. Ceci peut
même être utile dans certaines circonstances, comme au sein du débogueur.
9.7. Trucs et astuces
Il est parfois utile d'avoir un type de donnée similaire au "record" du Pascal ou
au struct du C, qui regroupent ensemble quelques attributs 'données' nommés. La
définition d'une classe vide remplit parfaitement ce besoin :
class Employee:
pass
john = Employee() # Create an empty employee record
9.8. Itérateurs
Vous avez maintenant certainement remarqué que l'on peut itérer sur la plupart des
objets conteneurs en utilisant une instruction for :
>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
next(it)
StopIteration
Une fois compris les mécanismes de gestion des itérateurs, il est simple d'ajouter ce
comportement à vos classes. Définissez une méthode __iter__() qui renvoie un
objet disposant d'une méthode __next__(). Si la classe définit elle-même la
méthode __next__(), alors __iter__() peut simplement renvoyer self :
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>>
9.9. Générateurs
Les générateurs sont des outils simples et puissants pour créer des itérateurs. Ils
sont écrits comme des fonctions classiques mais utilisent
l'instruction yield lorsqu'ils veulent renvoyer des données. À chaque fois qu'il est
appelé par next(), le générateur reprend son exécution là où il s'était arrêté (en
conservant tout son contexte d'exécution). Un exemple montre très bien combien les
générateurs sont simples à créer :
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
>>>
Tout ce qui peut être fait avec des générateurs peut également être fait avec des
itérateurs basés sur des classes, comme décrit dans le paragraphe précédent. Ce
qui rend les générateurs si compacts, c'est que les
méthodes __iter__() et __next__() sont créées automatiquement.
Une autre fonctionnalité clé est que les variables locales ainsi que le contexte
d'exécution sont sauvegardés automatiquement entre les appels. Cela simplifie
d'autant plus l'écriture de ces fonctions et rend leur code beaucoup plus lisible
qu'avec une approche utilisant des variables d'instance telles
que self.index et self.data.
Exemples :
>>>
Il existe une exception : les modules disposent d'un attribut secret en lecture seule
appelé __dict__ qui renvoie le dictionnaire utilisé pour implémenter l'espace de
nommage du module ; le nom __dict__ est un attribut mais pas un nom global.
Évidemment, si vous l'utilisez, vous brisez l'abstraction de l'implémentation des
espaces de nommage. Il est donc réservé à des choses comme les débogueurs
post-mortem.
>>>
>>> import os
>>> os.getcwd() # Return the current working directory
'C:\\Python37'
>>> os.chdir('/server/accesslogs') # Change current working
directory
>>> os.system('mkdir today') # Run the command mkdir in the
system shell
0
>>>
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's
docstrings>
>>>
>>>
>>>
import argparse
>>>
>>>
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
Lorsque les opérations sont simples, il est préférable d'utiliser les méthodes des
chaînes. Elles sont plus lisibles et plus faciles à déboguer :
>>>
10.6. Mathématiques
Le module math donne accès aux fonctions sur les nombres à virgule flottante
(float en anglais) de la bibliothèque C :
>>>
>>>
>>>
10.7. Accès à internet
Il existe beaucoup de modules permettant d'accéder à internet et gérer les protocoles
réseaux. Les deux plus simples sont urllib.request qui permet de récupérer des
données à partir d'une URL et smtplib pour envoyer des courriers électroniques :
>>>
(Notez que le deuxième exemple a besoin d'un serveur mail tournant localement.)
10.8. Dates et heures
Le module datetime propose des classes pour manipuler les dates et les heures de
manière simple ou plus complexe. Bien que faire des calculs de dates et d'heures
soit possible, la priorité de l'implémentation est mise sur l'extraction efficace des
attributs pour le formatage et la manipulation. Le module gère aussi les objets
dépendant des fuseaux horaires
>>>
10.9. Compression de données
Les formats d'archivage et de compression les plus communs sont directement gérés
par les modules zlib, gzip, bz2, lzma, zipfile et tarfile
>>>
>>>
10.11. Contrôle qualité
Une approche possible pour développer des applications de très bonne qualité est
d'écrire des tests pour chaque fonction au fur et à mesure de son développement,
puis d'exécuter ces tests fréquemment lors du processus de développement.
def average(values):
"""Computes the arithmetic mean of a list of numbers.
import doctest
doctest.testmod() # automatically validate the embedded tests
class TestStatisticalFunctions(unittest.TestCase):
def test_average(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
with self.assertRaises(ZeroDivisionError):
average([])
with self.assertRaises(TypeError):
average(20, 30, 70)
10.12. Piles fournies
Python adopte le principe des "piles fournies". Vous pouvez le constater au travers
des fonctionnalités évoluées et solides fournies par ses plus gros paquets. Par
exemple :
11.1. Formatage de l'affichage
Le module reprlib est une variante de la fonction repr(), spécialisé dans
l'affichage concis de conteneurs volumineux ou fortement imbriqués :
>>>
>>>
>>>
>>>
Le format utilise des marqueurs formés d'un $ suivi d'un identifiant Python valide
(caractères alphanumériques et tirets-bas). Entourer le marqueur d'accolades permet
de lui coller d'autres caractères alphanumériques sans intercaler une espace.
Écrire $$ produit un simple $ :
>>>
>>>
>>>
>>> t = BatchRename(fmt)
>>> date = time.strftime('%d%b%y')
>>> for i, filename in enumerate(photofiles):
... base, ext = os.path.splitext(filename)
... newname = t.substitute(d=date, n=i, f=ext)
... print('{0} --> {1}'.format(filename, newname))
import struct
start = 0
for i in range(3): # show the first 3 file
headers
start += 14
fields = struct.unpack('<IIIHH', data[start:start+16])
crc32, comp_size, uncomp_size, filenamesize, extra_size =
fields
start += 16
filename = data[start:start+filenamesize]
start += filenamesize
extra = data[start:start+extra_size]
print(filename, hex(crc32), comp_size, uncomp_size)
11.4. Fils d'exécution
Des tâches indépendantes peuvent être exécutées de manière non séquentielle en
utilisant des fils d'exécution (threading en anglais). Les fils d'exécution peuvent être
utilisés pour améliorer la réactivité d'une application qui interagit avec l'utilisateur
pendant que d'autres traitements sont exécutés en arrière-plan. Une autre utilisation
typique est de séparer sur deux fils d'exécution distincts les entrées / sorties et le
calcul.
Le code suivant donne un exemple d'utilisation du module threading exécutant des
tâches en arrière-plan pendant que le programme principal continue de s'exécuter :
class AsyncZip(threading.Thread):
def __init__(self, infile, outfile):
threading.Thread.__init__(self)
self.infile = infile
self.outfile = outfile
def run(self):
f = zipfile.ZipFile(self.outfile, 'w',
zipfile.ZIP_DEFLATED)
f.write(self.infile)
f.close()
print('Finished background zip of:', self.infile)
Bien que ces outils soient puissants, de petites erreurs de conception peuvent
engendrer des problèmes difficiles à reproduire. Donc, l'approche classique pour
coordonner des tâches est de restreindre l'accès d'une ressource à un seul fil
d'exécution et d'utiliser le module queue pour alimenter ce fil d'exécution en requêtes
venant d'autres fils d'exécution. Les applications utilisant des Queue pour leurs
communication et coordination entre fils d'exécution sont plus simples à concevoir,
plus lisibles et plus fiables.
11.5. Journalisation
Le module logging est un système de journalisation complet. Dans son utilisation la
plus élémentaire, les messages sont simplement envoyés dans un fichier ou
sur sys.stderr :
import logging
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found',
'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')
Par défaut, les messages d'information et de débogage sont ignorés, les autres sont
envoyés vers la sortie standard. Il est aussi possible d'envoyer les messages par
courriel, datagrammes, en utilisant des connecteurs réseau ou vers un serveur
HTTP. Des nouveaux filtres permettent d'utiliser des sorties différentes en fonction
de la priorité du message : DEBUG, INFO, WARNING, ERROR et CRITICAL.
11.6. Références faibles
Python gère lui-même la mémoire (par comptage des références pour la plupart des
objets et en utilisant un ramasse-miettes (garbage collector en anglais) pour éliminer
les cycles). La mémoire est libérée rapidement lorsque sa dernière référence est
supprimée.
Cette approche fonctionne bien pour la majorité des applications mais, parfois, il est
nécessaire de surveiller un objet seulement durant son utilisation par quelque chose
d'autre. Malheureusement, le simple fait de le suivre crée une référence qui rend
l'objet permanent. Le module weakref expose des outils pour suivre les objets sans
pour autant créer une référence. Lorsqu'un objet n'est pas utilisé, il est
automatiquement supprimé du tableau des références faibles et une fonction de
rappel (callback en anglais) est appelée. Un exemple typique est le cache d'objets
coûteux à créer :
>>>
>>>
>>> from array import array
>>> a = array('H', [4000, 10, 700, 22222])
>>> sum(a)
26932
>>> a[1:3]
array('H', [10, 700])
>>>
>>>
Par exemple, calculer 5 % de taxe sur une facture de 70 centimes donne un résultat
différent en nombre à virgule flottante binaire et décimale. La différence devient
significative lorsqu'on arrondit le résultat au centime près :
>>>
>>>
>>>
>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')
Cela signifie qu'il n'est pas toujours possible, pour une installation unique de Python,
de couvrir tous les besoins de toutes les applications. Basiquement, si une
application A dépend de la version 1.0 d'un module et qu'une application B dépend
de la version 2.0, ces dépendances entrent en conflit et installer la version 1.0 ou 2.0
laisse une des deux applications incapable de fonctionner.
La solution est de créer un environnement virtuel, un dossier auto-suffisant qui
contient une installation de Python pour une version particulière de Python ainsi que
des paquets additionnels.
Pour créer un environnement virtuel, décidez d'un dossier où vous voulez le placer et
exécutez le module venv comme un script avec le chemin du dossier :
tutorial-env\Scripts\activate.bat
source tutorial-env/bin/activate
(Ce script est écrit pour le shell bash. Si vous utilisez csh ou fish, utilisez les
variantes activate.csh ou activate.fish.)
Activer l'environnement virtuel change le prompt de votre ligne de commande pour
afficher le nom de l'environnement virtuel que vous utilisez. Cela modifie aussi
l'environnement afin, lorsque vous tapez python, d'exécuter la version spécifique de
Python installée dans l'environnement. Par exemple :
$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May 6 2016, 10:59:36)
...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
Vous pouvez installer la dernière version d'un paquet en indiquant son nom :
Vous pouvez installer une version spécifique d'un paquet en donnant le nom du
paquet suivi de == et du numéro de version souhaitée :
pip freeze produit une liste similaire des paquets installés mais l'affichage adopte un
format que pip install peut lire. La convention habituelle est de mettre cette liste dans
un fichier requirements.txt :
La bibliothèque standard :
Nous vous conseillons de naviguer dans le manuel, c'est une référence complète
(quoique laconique) sur les types, fonctions et modules de la bibliothèque standard.
La distribution standard de Python inclut énormément de code supplémentaire. Il
existe des modules pour lire les courriels, récupérer des documents via HTTP,
générer des nombres aléatoires, analyser les paramètres de la ligne de commande,
écrire des programmes CGI, compresser des données et beaucoup d'autres
fonctions. Une balade dans la documentation de la bibliothèque vous donnera une
idée de ce qui est disponible.
Installation de modules Python explique comment installer des paquets écrits
par d'autres utilisateurs de Python.
La référence du langage Python contient une explication détaillée de la
syntaxe et sémantique de Python. C'est une lecture fastidieuse, mais elle a sa place
dans une documentation exhaustive.
D'autres ressources :
Pour poser des questions ou remonter des problèmes liés à Python, vous pouvez
écrire sur le forum comp.lang.python ou les envoyer à la liste de diffusion <python-
list@python.org>. Le forum et la liste de diffusion sont liées, un message publié sur
l'un sera automatiquement transféré sur l'autre. Des centaines de messages y sont
publiés chaque jour, posant (ou répondant à) des questions, suggérant de nouvelles
fonctionnalités et annonçant des nouveaux modules. Les archives sont disponibles
à https://mail.python.org/pipermail/.
Notes
1 « Cheese Shop » est un sketch de Monty Python : un client entre dans une
fromagerie, mais peu importe le fromage que demande le client, le vendeur dit qu’il
n’en a pas.
0.125
0.001
a la valeur 0/2 + 0/4 + 1/8. Ces deux fractions ont une valeur identique, la seule
différence est que la première est une fraction décimale, la seconde est une fraction
binaire.
Le problème est plus simple à aborder en base 10. Prenons par exemple, la fraction
1/3. Vous pouvez l'approximer en une fraction décimale :
0.3
ou, mieux,
0.33
ou, mieux,
0.333
etc. Peu importe le nombre de décimales que vous écrivez, le résultat ne vaut jamais
exactement 1/3, mais c'est une estimation s'en approchant toujours mieux.
0.0001100110011001100110011001100110011001100110011...
Du fait de la manière dont les flottants sont affichés par l'interpréteur, il est facile
d'oublier que la valeur stockée est une approximation de la fraction décimale
d'origine. Python n'affiche qu'une approximation décimale de la valeur stockée en
binaire. Si Python devait afficher la vraie valeur décimale de l'approximation binaire
stockée pour 0,1, il afficherait
>>>
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
C'est bien plus de décimales que ce qu'attendent la plupart des utilisateurs, donc
Python affiche une valeur arrondie afin d'améliorer la lisibilité
>>>
>>> 1 / 10
0.1
>>>
>>> repr(math.pi)
'3.141592653589793'
Il est important de comprendre que tout cela n'est, au sens propre, qu'une illusion :
vous demandez simplement à Python d'arrondir la valeur stockée réellement dans la
machine à l'affichage.
Une autre conséquence du fait que 0,1 n'est pas exactement stocké 1/10 est que la
somme de trois valeurs de 0,1 ne donne pas 0,3 non plus :
>>>
>>> .1 + .1 + .1 == .3
False
Aussi, puisque 0,1 ne peut pas être stocké avec une représentation plus proche de
sa valeur exacte 1/10, comme 0,3 qui ne peut pas être plus proche de sa valeur
exacte 3/10, arrondir au préalable avec la fonction round() n'aide en rien :
>>>
Bien que les nombres ne peuvent se rapprocher plus de la valeur qu’on attend qu’ils
aient, la fonction round() peut être utile à postériori pour arrondir deux valeurs
inexactes et pouvoir les comparer :
>>>
Même s'il est vrai qu'il n'existe pas de réponse simple, ce n'est pas la peine de vous
méfier outre mesure des nombres à virgule flottante ! Les erreurs, en Python, dans
les opérations de nombres à virgule flottante sont dues au matériel sous-jacent et,
sur la plupart des machines, sont de l'ordre de 1 sur 2**53 par opération. C'est plus
que suffisant pour la plupart des tâches, mais vous devez garder à l'esprit que ce ne
sont pas des opérations décimales et que chaque opération sur des nombres à
virgule flottante peut souffrir d'une nouvelle erreur.
Bien que des cas pathologiques existent, pour la plupart des cas d'utilisations
courants vous obtiendrez le résultat attendu à la fin en arrondissant simplement au
nombre de décimales désirées à l'affichage avec str(). Pour un contrôle fin sur la
manière dont les décimales sont affichées, consultez dans Syntaxe de formatage de
chaîne les spécifications de formatage de la méthode str.format().
Si vous êtes un utilisateur intensif des opérations sur les nombres à virgule flottante,
nous vous conseillons de considérer le paquet Numerical Python ainsi que les
paquets pour les opérations statistiques et mathématiques fournis par le projet
SciPy. Consultez <https://scipy.org>.
Python fournit des outils qui peuvent être utiles dans les rares occasions où vous
voulez réellement connaître la valeur exacte d'un nombre à virgule flottante. La
méthode float.as_integer_ratio() donne la valeur du nombre sous forme de fraction :
>>>
>>> x = 3.14159
>>> x.as_integer_ratio()
(3537115888337719, 1125899906842624)
Puisque le ratio est exact, il peut être utilisé pour recréer la valeur originale sans
perte :
>>>
>>>
>>> x.hex()
'0x1.921f9f01b866ep+1'
Cette représentation hexadécimale petit être utilisée pour reconstruire, sans
approximation, le float :
>>>
>>> x == float.fromhex('0x1.921f9f01b866ep+1')
True
Puisque cette représentation est exacte, elle est pratique pour échanger des valeurs
entre différentes versions de Python (indépendamment de la machine) ou d'autres
langages qui comprennent ce format (tels que Java et C99).
Une autre fonction utile est math.fsum(), elle aide à diminuer les pertes de précision
lors des additions. Elle surveille les décimales perdues au fur et à mesure que les
valeurs sont ajoutées au total. Cela peut faire une différence au niveau de la
précision globale en empêchant les erreurs de s'accumuler jusqu'à affecter le résultat
final :
15.1. Erreurs de représentation
Cette section explique en détail l'exemple du "0.1" et montre comment vous pouvez
effectuer une analyse exacte de ce type de cas par vous-même. Nous supposons
que la représentation binaire des nombres flottants vous est familière.
en
J ~= 2**N / 10
>>>
Donc 56 est la seule valeur possible pour N qui laisse exactement 53 bits pour J. La
meilleure valeur possible pour J est donc ce quotient, arrondi :
>>>
Puisque la retenue est plus grande que la moitié de 10, la meilleure approximation
est obtenue en arrondissant par le haut :
>>>
>>> q+1
7205759403792794
7205759403792794 / 2 ** 56
3602879701896397 / 2 ** 55
Notez que puisque l'arrondi a été fait vers le haut, le résultat est en réalité
légèrement plus grand que 1/10 ; si nous n'avions pas arrondi par le haut, le quotient
aurait été légèrement plus petit que 1/10. Mais dans aucun cas il ne
vaut exactement 1/10 !
Donc l'ordinateur ne "voit" jamais 1/10 : ce qu'il voit est la fraction exacte donnée ci-
dessus, la meilleure approximation utilisant les nombres à virgule flottante double
précision de l'« IEEE-754 » :
>>>
>>> 0.1 * 2 ** 55
3602879701896397.0
Si nous multiplions cette fraction par 10**30, nous pouvons observer les valeurs de
ses 55 décimales de poids fort :
>>>
>>> 3602879701896397 * 10 ** 55 // 2 ** 55
1000000000000000055511151231257827021181583404541015625
>>>
>>>
>>> Fraction.from_float(0.1)
Fraction(3602879701896397, 36028797018963968)
>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)
>>> Decimal.from_float(0.1)
Decimal('0.100000000000000005551115123125782702118158340454101562
5')
>>> format(Decimal.from_float(0.1), '.17')
'0.10000000000000001'
16. Annexe
16.1. Mode interactif
16.1.1. Gestion des erreurs
Quand une erreur se produit, l'interpréteur affiche un message d'erreur et la trace
d'appels. En mode interactif, il revient à l'invite de commande primaire ; si l'entrée
provient d'un fichier, l'interpréteur se termine avec un code de sortie non nul après
avoir affiché la trace d'appels (les exceptions gérées par une clause except dans une
instruction try ne sont pas considérées comme des erreurs dans ce contexte).
Certaines erreurs sont inconditionnellement fatales et provoquent la fin du
programme avec un code de sortie non nul ; les incohérences internes et, dans
certains cas, les pénuries de mémoire sont traitées de la sorte. Tous les messages
d'erreur sont écrits sur le flux d'erreur standard ; l'affichage normal des commandes
exécutées est écrit sur la sortie standard.
#!/usr/bin/env python3.5
(en supposant que l'interpréteur est dans le PATH de l'utilisateur) au début du script
et en rendant le fichier exécutable. '#!' doivent être les deux premiers caractères du
fichier. Sur certaines plateformes, cette première ligne doit finir avec une fin de ligne
de type Unix ('\n') et pas de type Windows ('\r\n'). Notez que le caractère croisillon, '#',
est utilisé pour initier un commentaire en Python.
$ chmod +x myscript.py
Sur les systèmes Windows il n'y a pas de "mode exécutable". L'installateur Python
associe automatiquement les fichiers en .py avec python.exe de telle sorte qu'un
double clic sur un fichier Python le lance comme un script. L'extension peut aussi
être .pyw. Dans ce cas, la console n'apparait pas.
Ce fichier n'est lu qu'en mode interactif, pas quand Python lit les instructions depuis
un fichier, ni quand /dev/tty est donné explicitement comme fichier source (pour tout
le reste, Python se comporte alors comme dans une session interactive). Les
instructions de ce fichier sont exécutées dans le même espace de nommage que vos
commandes, donc les objets définis et modules importés peuvent être utilisés
directement dans la session interactive. Dans ce fichier, il est aussi possible de
changer les invites de commande sys.ps1 et sys.ps2.
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
with open(filename) as fobj:
startup_file = fobj.read()
exec(startup_file)
16.1.4. Modules de personnalisation
Python peut être personnalisé via les modules sitecustomize et usercustomize. Pour
découvrir comment ils fonctionnent, vous devez d'abord trouver l'emplacement de
votre dossier « site-packages » utilisateur. Démarrez Python et exécutez ce code :
>>>
Notes
Le cas d'utilisation le plus courant est, bien entendu, la simple invocation d'un script :
python myscript.py
1.1.1. Options de l'interface
L'interface de l’interpréteur ressemble à celle du shell UNIX mais fournit quelques
méthodes d'invocation supplémentaires :
-c <command>
Exécute le code Python dans command. command peut être une ou plusieurs
instructions, séparées par des fins de ligne, dont les espaces en début de ligne sont
significatives, comme dans le code d’un module.
-m <module-name>
Parcourt sys.path à la recherche du module donné et exécute son contenu en tant
que module __main__.
L'argument étant un nom de module, vous ne devez pas fournir d’extension de fichier
(.py). Le nom du module doit être un nom de module Python valide, absolu, mais
l'implémentation peut ne pas l'imposer (par exemple, l'utilisation d'un trait d'union
peut être autorisée).
Les noms de paquets sont aussi autorisés (ainsi que les paquets-espace de
nommage, namespace packages en anglais). Quand un nom de paquet est donné à
la place d'un simple module, l'interpréteur exécute <pkg>.__main__ comme module
principal. Ce comportement est délibérément identique au traitement d'un dossier ou
d'un fichier zip donné en argument à l'interpréteur comme script.
Note
Cette option ne peut pas être utilisée avec les modules natifs et les modules
d'extension écrits en C, étant donné qu'ils ne possèdent pas de fichiers modules en
Python. Cependant, elle peut toujours être utilisée pour les modules pré-compilés,
même si le fichier source original n'est pas disponible.
Modifié dans la version 3.1: Fournir le nom d'un paquet pour exécuter un sous-
module __main__.
-
Lit les commandes depuis l'entrée standard (sys.stdin). Si l'entrée standard est un
terminal, l'option -i est activée implicitement.
<script>
Exécute le code Python contenu dans script, qui doit être un chemin d'accès (absolu
ou relatif) à un fichier, faisant référence à un fichier Python, à un répertoire contenant
un fichier __main__.py ou à un fichier zip contenant un fichier __main__.py.
Si cette option est donnée, le premier élément de sys.argv est le nom du script tel
que donné sur la ligne de commande.
Voir aussi
runpy.run_path()
Voir aussi
Lancement de l'interpréteur
1.1.2. Options génériques
-?
-h
--help
Affiche une brève description de toutes les options de la ligne de commande.
-V
--version
Affiche la version de Python et termine. Par exemple :
Python 3.7.0b2+
Lorsque l'option est doublée, affiche davantage d'informations sur la manière dont
Python a été compilé, comme :
1.1.3. Options diverses
-b
Affiche un avertissement (warning en anglais) lors d'une comparaison d'un objet de
type bytes ou bytearray avec un objet de type str ou un objet de
type bytes avec un objet de type int. Lève une erreur si cette option est doublée ( -
bb).
-B
S'il est donné, Python ne tente pas d'écrire de fichier .pyc ou .pyo à l'importation
des modules sources. Voir aussi PYTHONDONTWRITEBYTECODE.
--check-hash-based-pycs default|always|never
Contrôle la façon dont sont validés les fichiers .pyc avec empreinte (voir Invalidation
de bytecode mis en cache). Quand la valeur est default, les caches de fichiers de
code intermédiaire sont validés en fonction de leur sémantique par défaut. Quand la
valeur est always, tous les fichiers .pyc, qu'ils soient vérifiés ou non, sont validés
par rapport à leurs fichiers sources correspondants. Quand la valeur est never, les
fichiers .pyc ne sont pas validés par rapport à leurs fichiers sources correspondants.
-d
Active la sortie de l'analyseur en mode débogage (pour les experts uniquement, en
fonction des options de compilation). Voir aussi PYTHONDEBUG.
-E
Ignore toutes les variables d'environnement PYTHON* qui pourraient être définies.
Par exemple, PYTHONPATH et PYTHONHOME.
-i
Quand un script est passé comme premier argument ou que l'option -c est utilisée,
entre en mode interactif après avoir exécuté le script ou la commande, même
lorsque sys.stdin ne semble pas être un terminal. Le fichier PYTHONSTARTUP n'est
pas lu.
Cela peut être utile pour examiner les variables globales ou une trace de la pile
lorsque le script lève une exception. Voir aussi PYTHONINSPECT.
-I
Lance Python en mode isolé. Cela implique aussi -E et -s. En mode
isolé, sys.path ne contient ni le répertoire du script ni le répertoire site-packages de
l'utilisateur. Toutes les variables d'environnement PYTHON* sont aussi ignorées.
Davantage de restrictions peuvent être imposées pour éviter que l'utilisateur n'injecte
du code malicieux.
-O
Enlève les instructions assert et tout le code qui dépend de la valeur de __debug__.
Ajoute .opt-1 au nom de fichier du code intermédiaire (bytecode), avant
l'extension .pyc (voir la PEP 488). Voir aussi PYTHONOPTIMIZE.
-OO
Agit comme -O et ignore aussi les docstrings. Ajoute .opt-2 au nom de fichier du
code intermédiaire (bytecode), avant l'extension .pyc (voir la PEP 488).
-q
N'affiche pas le copyright et la version, même en mode interactif.
-R
Active l'imprévisibilité du hachage. Cette option ne produit un effet que si la variable
d'environnement PYTHONHASHSEED est mise à 0, puisque l'imprévisibilité du hachage
est activée par défaut.
Sur les versions précédentes de Python, cette option activait l'imprévisibilité des
empreintes de manière à ce que les __hash__() de chaînes, bytes
et datetime soient "salés" avec une valeur aléatoire non prévisible. Bien que ce sel
soit constant durant le déroulement d'un processus Python, il n'est pas prévisible
pour des invocations répétées de code Python.
-s
N'ajoute pas le répertoire utilisateur site-packages à sys.path.
Voir aussi
-u
Force les flux de sortie et d'erreur standards à ne pas utiliser de tampon. Cette option
n'a pas d'effet sur le flux d'entrée standard.
Voir aussi PYTHONUNBUFFERED.
Modifié dans la version 3.7: la couche texte des flux de sortie et d'erreur standards
n'utilise maintenant plus de tampon.
-v
Affiche un message chaque fois qu'un module est initialisé, montrant l'emplacement
(nom du fichier ou module natif) à partir duquel il est chargé. Lorsque l'option est
doublée (-vv), affiche un message pour chaque fichier vérifié lors de la recherche du
module. Fournit aussi des informations sur le nettoyage des modules à la fin. Voir
aussi PYTHONVERBOSE.
-W arg
Contrôle des avertissements. Le mécanisme d'avertissement de Python, par défaut,
affiche les messages d'avertissement sur sys.stderr. Un message d'avertissement
type est de la forme suivante :
Par défaut, chaque avertissement est affiché une seule fois pour chaque ligne de
source où il se trouve. Cette option définit à quelle fréquence afficher ces
avertissements.
Les configurations les plus simples forcent l'application de l'action à tous les
avertissements émis par un processus (même ceux qui auraient été ignorés par
défaut) :
Les noms des actions peuvent être abrégés à votre convenance (par exemple. -
Wi, -Wd, -Wa, -We), l'interpréteur fait la résolution vers le nom adéquat.
-X
Réservée pour les options spécifiques aux différentes implémentations. CPython
reconnaît actuellement les valeurs suivantes :
-X faulthandler pour activer faulthandler ;
-X showrefcount pour afficher le compteur des références et le nombre de
blocs mémoire utilisés lorsque le programme se termine ou après chaque entrée de
l'interpréteur interactif. Ceci ne fonctionne que sur les versions compilées en mode
débogage.
-X tracemalloc pour lancer le suivi des allocations mémoire par Python en
utilisant le module tracemalloc. Par défaut, seul l'appel (la frame en anglais) le
plus récent est stocké dans la trace de la pile d'appels. Utilisez -
X tracemalloc=NFRAME pour lancer le suivi avec une limite des traces
à NFRAME appels. Voir tracemalloc.start() pour plus d'informations.
-X showalloccount pour afficher à la fin de l'exécution du programme le
total des objets alloués pour chaque type. Ceci ne fonctionne que si Python a été
compilé avec l'option COUNT_ALLOCS.
-X importtime affiche le temps mis pour chaque importation. Le temps total
par module est affiché (y compris le temps pris par les importations imbriquées) ainsi
que le temps propre du module (c-à-d sans les importations imbriquées). Notez que
l'affichage peut être perturbé dans une application avec de multiples fils d'exécution.
L'utilisation classique est python3 -X importtime -c 'import asyncio'. Voir
aussi PYTHONPROFILEIMPORTTIME.
-X dev: active le "mode développeur" de CPython, injectant des vérifications
à l'exécution qui ne sont pas actives par défaut. Ce n'est pas plus verbeux que le
mode par défaut si le code est correct : les avertissements supplémentaires ne sont
émis que quand un problème est détecté. Effets du mode développeur :
Il est aussi possible de passer des valeurs arbitraires et de les récupérer par le
dictionnaire sys._xoptions.
1.2. Variables d'environnement
Les variables d'environnement suivantes modifient le comportement de Python. Elles
sont analysées avant les options de la ligne de commande, autres que -E ou -I. Il est
d'usage que les options de la ligne de commande prennent le pas sur les variables
d'environnement en cas de conflit.
PYTHONHOME
Modifie l'emplacement des bibliothèques standards de Python. Par défaut, les
bibliothèques sont recherchées
dans préfixe/lib/pythonversion et préfixe_exec/lib/pythonversion où p
réfixe et préfixe_exec sont des répertoires qui dépendent de l'installation (leur
valeur par défaut étant /usr/local).
PYTHONPATH
Augmente le chemin de recherche par défaut des fichiers de modules. Le format est
le même que pour PATH du shell : un ou plusieurs chemins de répertoires séparés
par os.pathsep (par exemple, le caractère deux-points sous Unix et point-virgule
sous Windows). Les répertoires qui n'existent pas sont ignorés silencieusement.
PYTHONSTARTUP
S'il s'agit d'un nom de fichier accessible en lecture, les commandes Python de ce
fichier sont exécutées avant que la première invite ne soit affichée en mode interactif.
Le fichier est exécuté dans le même espace de nommage que les commandes
interactives, de manière à ce que les objets définis ou importés puissent être utilisés
sans qualificatif dans la session interactive. Vous pouvez aussi changer les
invites sys.ps1 et sys.ps2 ainsi que le point d'entrée (hook en
anglais) sys.__interactivehook__ dans ce fichier.
PYTHONOPTIMIZE
Si elle est définie à une chaîne non vide, c'est équivalent à spécifier l'option -O. Si
elle est définie à un entier, c'est équivalent à spécifier l'option -O plusieurs fois.
PYTHONBREAKPOINT
Si elle est définie, elle fait référence à un appelable en utilisant la notation des
chemins délimités par des points. Le module contenant l'appelable est importé et
l'appelable est alors lancé par l'implémentation par défaut
de sys.breakpointhook(), elle-même étant appelée par la fonction
native breakpoint(). Si elle n'est pas définie ou définie par une chaîne vide, elle
vaut la même chose que pdb.set_trace. La définir à la chaîne "0" entraine que
l'implémentation par défaut de sys.breakpointhook() ne fait rien et s'interrompt
immédiatement.
Nouveau dans la version 3.7.
PYTHONDEBUG
Si elle est définie à une chaîne non vide, c'est équivalent à spécifier l'option -d. Si
elle est définie à un entier, c'est équivalent à spécifier l'option -d plusieurs fois.
PYTHONINSPECT
Si elle est définie à une chaîne non vide, c'est équivalent à spécifier l'option -i.
PYTHONUNBUFFERED
Si elle est définie à une chaîne non vide, c'est équivalent à spécifier l'option -u.
PYTHONVERBOSE
Si elle est définie à une chaîne non vide, c'est équivalent à spécifier l'option -v. Si
elle est définie à un entier, c'est équivalent à spécifier l'option -v plusieurs fois.
PYTHONCASEOK
Si elle est définie, Python ignore la casse dans les instructions import. Ceci ne
fonctionne que sous Windows et OS X.
PYTHONDONTWRITEBYTECODE
Si elle est définie et n'est pas une chaîne vide, Python n'écrit pas de fichier .pyc à
l'importation des modules sources. C'est équivalent à spécifier l'option -B.
PYTHONHASHSEED
Si cette variable n'est pas définie ou définie à random, une valeur aléatoire est
utilisée pour saler les empreintes des objets de type chaine, bytes et datetime.
Si PYTHONHASHSEED est définie à une valeur entière, elle est utilisée comme valeur
de salage pour générer les empreintes des types utilisant l'imprévisibilité du
hachage.
L'objectif est d'avoir des empreintes reproductibles, pour des tests de l'interpréteur
lui-même ou pour qu'un groupe de processus Python puisse partager des
empreintes.
Le nombre entier doit être écrit en base 10 et être compris entre 0 et 4 294 967 295.
Spécifier la valeur 0 désactive l'imprévisibilité des empreintes.
PYTHONIOENCODING
Si la variable est définie sous la
forme nom_encodage:gestionnaire_erreur avant le lancement de l'interpréteur,
cela prend le pas sur l'encodage utilisé pour l'entrée standard, la sortie standard ou
la sortie d'erreur. nom_encodage et :gestionnaire_erreur sont facultatifs tous
les deux et possèdent la même signification que dans str.encode().
Modifié dans la version 3.6: sous Windows, l'encodage spécifié par cette variable est
ignoré pour le tampon des consoles interactives à moins
que PYTHONLEGACYWINDOWSSTDIO ne soit aussi spécifié. Les fichiers et tubes
(pipes en anglais) redirigés vers les flux standards ne sont pas concernés.
PYTHONNOUSERSITE
Si elle est définie, Python n'ajoute pas le répertoire site-
packages propre à l'utilisateur à sys.path.
Voir aussi
Voir aussi
PYTHONEXECUTABLE
Si cette variable d'environnement est définie, sys.argv[0] est définie à cette valeur
au lieu de la valeur fournie par l'exécutable. Ne fonctionne que sur Mac OS X.
PYTHONWARNINGS
C'est équivalent à spécifier l'option -W. Si la valeur est une chaîne séparée par des
virgules, c'est équivalent à spécifier l'option -W plusieurs fois. Dans ce cas, les filtres
spécifiés en derniers prennent le pas sur ceux qui les précèdent dans la liste.
Les configurations les plus simples forcent l'application de l'action à tous les
avertissements émis par un processus (même ceux qui auraient été ignorés par
défaut) :
PYTHONFAULTHANDLER
Si elle est définie à une chaîne non vide, faulthandler.enable() est appelée au
démarrage : ceci installe un gestionnaire pour les
signaux SIGSEGV, SIGFPE, SIGABRT, SIGBUS et SIGILL afin de générer une trace
de la pile d'appels. C'est équivalent à spécifier l'option -X faulthandler.
PYTHONTRACEMALLOC
Si elle est définie à une chaîne non vide, lance le suivi des allocations mémoire par
Python en utilisant le module tracemalloc. La valeur de la variable définit le
nombre maximum d'appels (les frames en anglais) stockés dans la trace de pile
d'appels. Par exemple, PYTHONTRACEMALLOC=1 ne stocke que l'appel le plus récent.
Voir tracemalloc.start() pour davantage d'informations.
PYTHONPROFILEIMPORTTIME
Si elle est définie et n'est pas une chaîne vide, Python affiche le temps pris par les
importations. C'est exactement équivalent à donner -X importtime en ligne de
commande.
PYTHONASYNCIODEBUG
Si elle est définie à une chaîne non vide, active le mode debogage du
module asyncio.
PYTHONMALLOC
Définit l'allocateur mémoire de Python ou installe des points d'entrée (hooks en
anglais) de débogage.
Reportez-vous au chapitre default-memory-allocators et à la
fonction PyMem_SetupDebugHooks() (configure des points d'entrée de débogage
sur les allocateurs de mémoire de Python).
PYTHONMALLOCSTATS
Si elle est définie à une chaîne non vide, Python affiche des statistiques relatives à
l’allocateur mémoire pymalloc chaque fois qu'un objet est créé par ce gestionnaire,
ainsi qu'à la fin de l'exécution du programme.
Modifié dans la version 3.6: cette variable peut maintenant être utilisée avec Python
compilé en mode release. Elle n'a pas d'effet si elle est définie à une chaine vide.
PYTHONLEGACYWINDOWSFSENCODING
Si elle est définie et n’est pas une chaîne vide, l'encodage par défaut respectivement
du système de fichiers et des erreurs reviennent à leur valeur pré-3.6,
respectivement 'mbcs' et 'replace'. Sinon, les nouvelles valeurs par
défaut "UTF-8" et "surrogatepass" sont utilisées.
Disponibilité : Windows.
PYTHONLEGACYWINDOWSSTDIO
Si elle est définie et n’est pas une chaîne vide, n'utilise pas les lecteur et écrivain de
la nouvelle console. Cela signifie que les caractères Unicode sont encodés avec
l'encodage de la console active plutôt qu'en UTF-8.
Cette variable est ignorée si les flux standards sont redirigés (vers des fichiers ou
des tubes) plutôt que pointant vers des mémoires tampons de console.
Disponibilité : Windows.
PYTHONCOERCECLOCALE
Si elle est définie à la valeur 0, l'application en ligne de commande principale Python
ne prend pas en compte les configurations régionales C et POSIX à base ASCII,
mais bascule sur une alternative basée sur l'UTF-8 qui doit posséder plus de
possibilités.
Si cette variable n'est pas définie (ou est définie à une valeur autre que 0), que la
variable d'environnement de configuration régionale LC_ALL est également non
définie et que la configuration régionale indiquée dans la catégorie LC_TYPE est soit
la région par défaut C, soit la région POSIX qui demande explicitement de l'ASCII,
alors l'interpréteur en ligne de commande Python essaie de configurer les
paramètres régionaux pour la catégorie LC_TYPE dans l'ordre suivant avant de
charger l'exécutable de l'interpréteur :
C.UTF-8
C.utf8
UTF-8
PYTHONDEVMODE
Si cette variable d'environnement est définie et non vide, active le "mode
développeur" de CPython. Voir l'option -X dev.
PYTHONUTF8
Si elle vaut 1, active le mode UTF-8 pour l'interpréteur, où UTF-8 est utilisé pour
encoder le texte en interface avec le système, quelle que soit la configuration
régionale en vigueur.
En raison des changements apportés à ces API de bas-niveau, les API de haut-
niveau ont un comportement par défaut différent :
Notez que la configuration des flux standards en mode UTF-8 peut être surchargée
par PYTHONIOENCODING (de la même manière qu'elles peuvent l'être dans le mode
par défaut qui est configuré pour la région locale).
Si elle vaut 0, l'interpréteur fonctionne dans le mode configuré pour la région locale
(mode par défaut).
Définir une valeur autre (non vide) entraine une erreur pendant l'initialisation de
l'interpréteur.
PYTHONTHREADDEBUG
Si elle est définie, Python affiche des informations de débogage relatives aux
différents fils d'exécution.
PYTHONDUMPREFS
Si elle est définie, Python affiche (de manière brute) les objets et les compteurs de
références toujours existant après la fermeture de l'interpréteur.
Dans le cas où Python n'est pas pré-installé et n'est pas dans les dépôts non plus,
vous pouvez facilement faire les paquets pour votre propre distribution. Jetez un œil
à ces liens :
Voir aussi
https://www.debian.org/doc/manuals/maint-guide/first.fr.html
pkg_add -r python
pkg_add
ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/<insert your
architecture here>/python-<version>.tgz
pkg_add
ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/i386/python-
2.5.1p2.tgz
2.1.3. Sur OpenSolaris
Vous pouvez récupérer Python depuis OpenCSW. Différentes versions de Python
sont disponibles et peuvent être installées. Exemple : pkgutil -i python27.
2.2. Compiler Python
Si vous voulez compiler CPython vous-même, la première chose à faire est de
récupérer le code source. Vous pouvez télécharger la dernière version ou faire
un clone. (Si vous voulez contribuer à des correctifs, il vous faut un clone.)
./configure
make
make install
Avertissement
Par exemple, sur la plupart des systèmes Linux, leur valeur par défaut est /usr.
Fichier/dossier Signification
Emplacement recommandé de
exec_prefix/bin/python3
l'interpréteur.
Fichier/dossier Signification
2.4. Divers
Pour utiliser facilement des scripts Python sur Unix, vous devez les rendre
exécutables, par exemple avec
$ chmod +x script
#!/usr/bin/env python3
L'installateur complet contient tous les composants et est la meilleure option pour les
développeurs utilisant Python pour tout type de projet.
3.1. L'installateur complet
3.1.1. Étapes d'installation
Quatre installateurs Python 3.7 sont disponibles au téléchargement — deux de
chaque pour les versions 32-bit et 64-bit de l'interpréteur. L'installateur web est
léger, et téléchargera automatiquement les composants nécessaires. L'installateur
hors-ligne inclut les composants nécessaires pour une installation par défaut et n'a
besoin d'une connexion internet que pour des fonctionnalités optionnelles.
Voir Installation sans téléchargement pour d'autres moyens d’éviter des
téléchargements durant l'installation.
Pour effectuer une installation pour tous les utilisateurs, vous devez sélectionner
"Personnaliser l'installation". Dans ce cas :
3.1.2. Suppression de la limitation MAX_PATH
Historiquement les chemins sous Windows étaient limités 260 caractères. Cela
impliquait que les chemins plus longs n'étaient pas résolus, et seraient une cause
d'erreurs.
Dans les dernières versions de Windows, cette limitation peut être étendue à
approximativement 32.000 caractères. Votre administrateur devra activer la stratégie
de groupe "Enable Win32 long paths" ou mettre la valeur du
registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSys
tem@LongPathsEnabled à 1.
%LocalAppData
%\Programs\PythonXY ou %L
Le dossier d'installation par
DefaultJustForMe ocalAppData
défaut pour des installations juste
TargetDir %\Programs\PythonXY-32 o
pour soi
u %LocalAppData
%\Programs\PythonXY-64
Le dossier d'installation
DefaultCustomTar
personnalisé par défaut affiché (vide)
getDir
par l'interface utilisateur
Ajoute les
PrependPath dossiers install et Scripts à 0
PATH et assigne .PY à PATHEXT
Include_pip Installe pip et setuptools 1
Un message personnalisé à
SimpleInstallDescr afficher quand l'interface
(vide)
iption d'installation simplifiée est
utilisée.
Par exemple, pour installer silencieusement Python sur tout le système, vous
pourriez utilisez la commande suivante (depuis une invite de commande
administrateur) :
Les options listées ci-dessus peuvent aussi être passées dans un fichier
nommé unattend.xml à côté de l'exécutable. Ce fichier spécifie une liste d'options
et de valeurs. Quand une valeur est donnée en tant qu'attribut, elle sera convertie en
nombre si possible. Les valeurs données en élément texte sont toujours laissées en
tant que chaînes de caractères. Ce fichier d'exemple propose les mêmes options que
l'exemple précédent :
<Options>
<Option Name="InstallAllUsers" Value="no" />
<Option Name="Include_launcher" Value="0" />
<Option Name="Include_test" Value="no" />
<Option Name="SimpleInstall" Value="yes" />
<Option Name="SimpleInstallDescription">Just for me, no test
suite</Option>
</Options>
"Repair" vérifiera tous les fichiers qui doivent être installés avec les paramètres
actuels le sont, et remplacera ceux qui ont étés supprimés ou modifiés.
Note
Pour installer le paquet, assurez-vous d'avoir les dernières mises à jour de Windows
10 et de chercher dans l'application Microsoft Store “Python 3.7”. Assurez-vous que
l'application que vous sélectionnez est publiée par la Python Software Foundation et
installez-la.
Avertissement
Python sera toujours disponible gratuitement sur le Microsoft Store. Si vous êtes
invité à payer, vous n'avez pas sélectionné le bon paquet.
Après l'installation, Python peut être lancé depuis le menu Démarrer. Il est aussi
disponible à partir de n'importe quelle invite de commande ou session PowerShell en
entrant python. De plus, pip et IDLE peuvent être utilisés en entrant pip ou idle .
IDLE peut également être trouvé dans le menu Démarrer.
Les trois commandes sont également disponibles avec les suffixes de numéro de
version, par exemple, python3.exe et python3.x.exe ainsi
que python.exe (ou 3.x est la version spécifique que vous souhaitez lancer, tel
que 3.7).
Si vous avez installé une autre version de Python et l'avez ajoutée à votre variable
d'environnement PATH, elle sera disponible en tant que python.exe plutôt que celle
de la boutique Microsoft. Pour accéder à la nouvelle installation,
utilisez python3.exe ou python3.x.exe.
3.2.1. Problèmes connus
Actuellement, le lanceur py.exe ne peut pas être utilisé pour démarrer Python
lorsqu'il a été installé à partir de la boutique Microsoft.
En raison de restrictions sur les applications Microsoft Store, les scripts Python
peuvent ne pas avoir un accès en écriture complet aux emplacements partagés tels
que TEMP et le registre. Au lieu de cela, il écrira sur une copie privée. Si vos scripts
doivent modifier les emplacements partagés, vous devrez installer le programme
d'installation complet.
3.3. Les paquets nuget.org
Nouveau dans la version 3.5.2.
Le paquet nuget.org est un environnement Python de taille réduite destiné à être
utilisé sur des systèmes d'intégration et de génération continus qui n'ont pas Python
d'installé. Alors que nuget est “le gestionnaire de package pour .NET”, il fonctionne
également parfaitement bien pour les packages contenant des outils de build-time.
Visitez nuget.org pour les informations les plus à jour sur l'utilisation de nuget. Ce qui
suit est un résumé suffisant pour les développeurs Python.
# Without -ExcludeVersion
> .\python.3.5.2\tools\python.exe -V
Python 3.5.2
# With -ExcludeVersion
> .\python\tools\python.exe -V
Python 3.5.2
En général, les paquets nuget ne peuvent pas êtres mis à jour et les versions plus
récentes doivent être installées côte à côte et référencées à l'aide du chemin d'accès
complet. Vous pouvez également supprimer le répertoire du paquet manuellement et
l'installer à nouveau. De nombreux systèmes CI le feront automatiquement s'ils ne
conservent pas les fichiers entre les builds.
Une fois extrait, la distribution intégrée est (presque) entièrement isolée du système
de l'utilisateur, y compris les variables d'environnement, les paramètres du registre
système et les paquets installés. La bibliothèque standard est incluse en tant que
fichiers pré-compilés et optimisés .pyc dans un fichier ZIP,
et python3.dll, python37.dll, python.exe et pythonw.exe sont tous
fournis. Tcl/Tk (y compris tous les dépendants, telles que IDLE), pip et la
documentation Python ne sont pas inclus.
Note
Les paquets tiers doivent être installés par le programme d'installation de l'application
parallèlement à la distribution embarquée. L'utilisation de pip pour gérer les
dépendances comme pour une installation Python régulière n'est pas prise en charge
avec cette distribution, mais il reste possible d'inclure et d'utiliser pip pour les mises à
jour automatiques. En général, les paquets tiers doivent être traités dans le cadre de
l'application (vendoring) afin que le développeur puisse assurer la compatibilité avec
les versions plus récentes avant de fournir des mises à jour aux utilisateurs.
Les deux cas d'utilisation recommandés pour cette distribution sont décrits ci-
dessous.
3.4.1. Application Python
Une application écrite en Python n'exige pas nécessairement que les utilisateurs
soient au courant de ce fait. La distribution embarquée peut être utilisée dans ce cas
pour inclure une version privée de Python dans un package d'installation. Selon la
façon dont il devrait être transparent (ou inversement, à quel point il doit paraître
professionnel), il y a deux options.
Avec cette dernière approche, les packages doivent être installés en tant que
répertoires à côté de l'exécutable Python pour s'assurer qu'ils soient visibles par
Python. Avec le lanceur spécialisé, les paquets peuvent être installés dans d'autres
emplacements car il y a une possibilité de spécifier le chemin de recherche avant de
lancer l'application.
3.4.2. Embarquer Python
Les applications écrites en code natif nécessitent souvent une certaine forme de
langage de scripting, et la distribution Python intégrée peut être utilisée à cette fin.
En général, la majorité de l'application est dans le code natif, qui soit
invoque python.exe soit utilise directement python3.dll. Dans les deux cas,
l'extraction de la distribution intégrée dans un sous-répertoire de l'installation de
l'application est suffisante pour fournir un interpréteur Python chargeable.
Comme pour l'utilisation de l'application, les paquets peuvent être installés sur
n'importe quel emplacement, car il est possible de spécifier des chemins de
recherche avant d'initialiser l'interpréteur. Sinon, il n'y a pas de différences
fondamentales entre l'utilisation de la distribution embarquée et une installation
classique.
3.5. Paquets alternatifs
À part la distribution standard CPython, il y a des paquets modifiés incluant des
fonctionnalités additionnelles. La liste qui suit est une liste de versions populaires et
de leurs fonctionnalités principales :
ActivePython
Anaconda
Canopy
WinPython
Notez que ces paquets peuvent ne pas inclure la dernière version de Python ou
d'autres bibliothèques, et ne sont pas maintenus ni supportés par les core
devs Python.
3.6. Configurer Python
Pour exécuter Python confortablement à partir d'une invite de commandes, vous
pouvez envisager de modifier certaines variables d'environnement par défaut dans
Windows. Bien que l'installateur offre une option pour configurer les
variables PATH et PATHEXT pour vous, ce n'est fiable que pour une seule installation
à l'échelle du système. Si vous utilisez régulièrement plusieurs versions de Python,
pensez à utiliser le Lanceur Python pour Windows.
3.6.1. Digression : Définition des variables
d'environnement
Windows permet de configurer les variables d'environnement de façon permanente
au niveau de l'utilisateur et du système, ou temporairement dans une invite de
commandes.
Un nom de variable entre des signes pour cent sera remplacé par sa valeur, vous
permettant d'ajouter votre nouvelle valeur au début ou à la fin.
Ajouter python.exe au début de PATH est un moyen courant de s'assurer que la
version correcte de Python est lancée.
Note
Sur la première page de l'installateur, une option intitulée "Ajouter Python au PATH"
peut être sélectionnée pour que l'installateur ajoute l'emplacement d'installation dans
le PATH. L'emplacement du dossier Scripts\ y est également ajouté. Cela vous
permet de taper Python pour exécuter l'interpréteur, et pip pour l'installateur de
paquets. Ainsi, vous pouvez également exécuter vos scripts avec les options de ligne
de commande, voir la documentation Ligne de commande.
Si vous n'activez pas cette option au moment de l'installation, vous pouvez toujours
ré-exécuter l'installateur, sélectionner Modifier et l'activer. Vous pouvez également
modifier manuellement le PATH à l'aide des instructions de Digression : Définition des
variables d'environnement. Vous devez définir votre variable
d'environnement PATH pour inclure le répertoire de votre installation Python, délimité
par un point-virgule des autres entrées. Une variable d'exemple pourrait ressembler
à ceci (en supposant que les deux premières entrées existaient déjà) :
Windows still uses legacy encodings for the system encoding (the ANSI Code Page).
Python uses it for the default encoding of text files
(e.g. locale.getpreferredencoding()).
This may cause issues because UTF-8 is widely used on the internet and most Unix
systems, including WSL (Windows Subsystem for Linux).
You can use UTF-8 mode to change the default text encoding to UTF-8. You can
enable UTF-8 mode via the -X utf8 command line option, or
the PYTHONUTF8=1 environment variable. See PYTHONUTF8 for enabling UTF-8
mode, and Digression : Définition des variables d'environnement for how to modify
environment variables.
Note that adding PYTHONUTF8=1 to the default environment variables will affect all
Python 3.7+ applications on your system. If you have any Python 3.7+ applications
which rely on the legacy system encoding, it is recommended to set the environment
variable temporarily or use the -X utf8 command line option.
Note
Even when UTF-8 mode is disabled, Python uses UTF-8 by default on Windows for:
Console I/O including standard I/O (see PEP 528 for details).
The filesystem encoding (see PEP 529 for details).
3.8. Lanceur Python pour Windows
Nouveau dans la version 3.3.
3.8.1. Pour commencer
3.8.1.1. Depuis la ligne de commande
py
Vous devriez voir se lancer la dernière version de Python installée — il peut être
quitté normalement, et tous les arguments de ligne de commande supplémentaires
spécifiés seront envoyés directement à Python.
Si plusieurs versions de Python sont installées (par exemple, 2.7 et 3.7), vous aurez
remarqué que Python 3.7 se lance -- pour lancer Python 2.7, essayez la commande :
py -2.7
Si vous voulez que la dernière version de Python 2.x que vous avez installé, essayez
la commande :
py -2
3.8.1.2. Environnements virtuels
#! python
import sys
sys.stdout.write("hello from Python %s\n" % (sys.version,))
py hello.py
Vous devriez voir le numéro de version du Python 2.x le plus récemment installé.
Maintenant, essayez de changer la première ligne en :
#! python3
L'avantage principal de ceci est qu'un seul lanceur peut prendre en charge plusieurs
versions de Python en même temps en fonction du contenu de la première ligne.
3.8.2. Lignes Shebang
Si la première ligne d'un fichier de script commence par #!, elle est connue sous le
nom de ligne "shebang". Linux et d'autres systèmes basés sur Unix ont une prise en
charge native de ces lignes et les shebangs sont couramment utilisés sur ces
systèmes pour indiquer comment un script doit être exécuté. Ce lanceur permet aux
mêmes installations d'être utilisés avec des scripts Python sur Windows et les
exemples ci-dessus démontrent leur utilisation.
Pour permettre aux shebang dans les scripts Python d'être portables entre UNIX et
Windows, ce lanceur prend en charge un certain nombre de commandes
« virtuelles » pour spécifier l'interpréteur à utiliser. Les commandes virtuelles prises
en charge sont :
/usr/bin/env python
/usr/bin/python
/usr/local/bin/python
python
#! /usr/bin/python
Le Python par défaut sera trouvé et utilisé. Comme de nombreux scripts Python
écrits pour fonctionner sur UNIX auront déjà cette ligne, ils devraient fonctionner
avec le lanceur sans modification. Si vous écrivez un nouveau script sur Windows et
que vous pensez qu'il sera utile sur UNIX, vous devez utiliser l'une des
lignes shebang commençant par /usr.
Les commandes virtuelles ci-dessus peuvent être suffixées avec une version
explicite (soit seulement la version principale, soit la version principale et mineure).
De plus la version 32-bit peut être demandée en ajoutant -32 après le numéro de
version mineur. Par exemple /usr/bin/python2.7-32 demande d’utiliser la
version 32-bit de Python 2.7.
Nouveau dans la version 3.7: Depuis la version 3.7 du lanceur Python, il est possible
de demander une version 64-bit en utilisant le suffixe -64. De plus il est possible de
spécifier une version majeure et une architecture sans version mineure (par
exemple /usr/bin/python3-64).
#! /usr/bin/python -v
3.8.4. Personnalisation
3.8.4.1. Personnalisation via des fichiers INI
Dans certains cas, un qualificateur de version peut être inclus dans une commande
pour dicter quelle version de Python sera utilisée par la commande. Un qualificateur
de version commence par un numéro de version majeure et peut éventuellement être
suivi d'un point (.) et d'un spécificateur de version secondaire. De plus il est possible
de préciser si une implémentation 32 ou 64 bit doit être demandée en ajoutant -
32 ou -64.
Sur Windows 64-bits avec les implémentations 32-bits et 64-bits de la même version
Python (major.minor) installée, la version 64-bit est toujours préférée. Cela est vrai
pour les implémentations 32-bits et 64-bits du lanceur – un lanceur 32-bits préfère
exécuter une installation Python de 64-bits de la version spécifiée si elle est
disponible. Le comportement du lanceur est donc prévisible en sachant seulement
quelles versions sont installées sur le PC et sans tenir compte de l'ordre dans lequel
ils ont été installés (i.e., sans savoir si une version 32 ou 64-bit de Python et le
lanceur correspondant a été installé en dernier). Comme indiqué ci-dessus, un
suffixe optionnel -32 ou -64 peut être utilisé sur un spécificateur de version pour
modifier ce comportement.
Exemples :
Si aucune option pertinente n'est définie, les
commandes python et python2 utiliseront la dernière version de Python 2.x
installée et la commande python3 utilisera le dernier Python 3.x installé.
Les commandes python3.1 et python2.7 ne consultent aucune option du
tout car les versions sont entièrement spécifiées.
Si PY_PYTHON=3, les commandes python et python3 utiliseront la dernière
version de Python 3 installée.
Si PY_PYTHON=3.1-32, la commande python utilisera l'implémentation 32-
bits de 3.1 alors que la commande python3 utilisera le dernier Python installé
(PY_PYTHON n'a pas été considéré du tout comme une version majeure a été
spécifiée.)
Si PY_PYTHON=3 et PY_PYTHON3=3.1, les
commandes python et python3 utiliseront spécifiquement 3.1
Par exemple :
Le paramètre PY_PYTHON=3.1 équivaut au fichier INI contenant :
[defaults]
python=3.1
Le paramètre PY_PYTHON=3 et PY_PYTHON3=3.1 équivaut au
fichier INI contenant :
[defaults]
python=3
python3=3.1
3.8.5. Diagnostics
Si une variable d'environnement PYLAUNCH_DEBUG est définie (à n'importe quelle
valeur), le lanceur affichera des informations de diagnostic sur stderr (c'est-à-dire sur
la console). Bien que ces informations parviennent à être en même temps
nombreuses et concises, elles devraient vous permettre de voir quelles versions de
Python ont été trouvées, pourquoi une version particulière a été choisie et la ligne de
commande exacte utilisée pour exécuter le Python cible.
3.9. Recherche de modules
Python stocke généralement sa bibliothèque (et donc votre dossier site-packages)
dans le répertoire d'installation. Donc, si vous aviez installé Python
dans C:\Python\, la bibliothèque par défaut résiderait dans C:\Python\Lib\ et
les modules tiers devraient être stockés dans C:\Python\Lib\site-packages\.
Une entrée vide est ajoutée au début, qui correspond au répertoire courant.
Si la variable d'environnement PYTHONPATH existe, comme décrit
dans Variables d'environnement, ses entrées sont ajoutées ensuite. Notez que sur
Windows, les chemins d'accès de cette variable doivent être séparés par des points-
virgules, pour les distinguer des deux points utilisés dans les identificateurs de
lecteur (C:\ etc.).
Des "chemins d'accès d'application" supplémentaires peuvent être ajoutés
dans le registre en tant que sous-clés
de \SOFTWARE\Python\PythonCore{version}\PythonPath sous les
ruches HKEY_CURRENT_USER et HKEY_LOCAL_MACHINE. Les sous-clés qui ont des
chaînes de chemin délimitées par des points-virgules comme valeur par défaut
entraînent l'ajout de chaque chemin d'accès à sys.path. (Notez que tous les
installateurs connus utilisent seulement HKLM, donc HKCU est généralement vide.)
Si la variable d'environnement PYTHONHOME est définie, elle est supposée
comme "Python Home". Sinon, le chemin de l'exécutable principal de Python est
utilisé pour chercher un "fichier de repère" (soit Lib\os.py ou pythonXY.zip) pour
déduire le "Python Home". Si un "Python Home" est trouvé, les sous-répertoires
correspondants ajoutés à sys.path (Lib, plat-win, etc) sont basés sur ce dossier.
Sinon, le chemin d'accès Python principal est construit à partir du PythonPath stocké
dans le registre.
Si le "Python Home" ne peut pas être trouvé, PYTHONPATH n'est pas spécifié
dans l'environnement et aucune entrée de registre ne peut être trouvée, un chemin
par défaut avec des entrées relatives est utilisé (par exemple .\Lib ; .\plat-win,
etc.).
Pour ceux qui veulent intégrer Python dans leur application ou leur distribution, les
conseils suivants empêcheront les conflits avec d'autres installations :
Ceux-ci garantiront que les fichiers d'une installation à l'échelle du système n'auront
pas la priorité sur la copie de la bibliothèque standard livrée avec votre application.
Sinon, vos utilisateurs pourraient rencontrer des problèmes en utilisant votre
application. Notez que la première suggestion est la meilleure, car les autres peuvent
encore être sensibles aux chemins non-standard dans le registre et le site-
packages utilisateur.
3.10. Modules supplémentaires
Même si Python a l'ambition d'être portable parmi toutes les plates-formes, il existe
des fonctionnalités propres à Windows. Certains modules, à la fois dans la
bibliothèque standard et externe, et des exemples existent pour utiliser ces
fonctionnalités.
3.10.1. PyWin32
Le module PyWin32 de Mark Hammond est une collection de modules pour un
support avancé spécifique à Windows. Cela inclut les services pour :
PythonWin est un exemple d'application MFC livrée avec PyWin32. Il s'agit d'un IDE
embarqué avec débogueur intégré.
Voir aussi
Win32 How Do I...?
3.10.3. WConio
Depuis la couche avancée de gestion de terminal de Python, curses, est limité aux
systèmes de type UNIX, il existe une bibliothèque exclusive à Windows : Windows
Console I/O for Python.
L'arborescence source contient une solution de compilation et des fichiers projet pour
Microsoft Visual Studio 2015, qui est le compilateur utilisé pour générer les versions
officielles de Python. Ces fichiers se trouvent dans le répertoire PCbuild.
Voir aussi
Python + Windows + distutils + SWIG + gcc MinGW
ou "Creating Python extensions in C/C++ with SWIG and compiling them with
MinGW gcc under Windows" ou "Installing Python extension with distutils and without
Microsoft Visual C++" par Sébastien Sauvage, 2003
3.12. Autres plateformes
Avec le développement continu de Python, certaines plateformes qui étaient
auparavant prises en charge ne sont plus prises en charge (en raison du manque
d'utilisateurs ou de développeurs). Voir PEP 11 pour plus de détails sur toutes les
plateformes non prises en charge.
Voir Python pour Windows pour des instructions détaillées sur les plateformes avec
installateurs pré-compilés.
Python sur un Macintosh exécutant Mac OS X est en principe très similaire à Python
sur n'importe quelle autre plateforme Unix, mais il y a un certain nombre de
fonctionnalités additionnelle telle que l'IDE et le gestionnaire de paquets qui méritent
d'être soulignées.
Si vous êtes familier avec Python sur d'autres plateformes Unix, vous devriez lire la
section sur comment exécuter des scripts Python depuis un shell Unix.
Si vous souhaitez exécuter des scripts Python depuis l'invite de commande dans la
fenêtre Terminal, ou depuis le Finder, vous avez d'abord besoin d'un éditeur pour
créer votre script. Max OS X propose un certain nombre d’éditeurs shell Unix
standards, dont vim et emacs. Si vous voulez une interface plus
Mac, BBEdit ou TextWrangler de Bare Bones Software
(voir http://www.barebones.com/products/bbedit/index.html) sont de bons choix, tout
comme TextMate (voir https://macromates.com/). D'autres éditeurs existent
comme Gvim (http://macvim-dev.github.io/macvim/)
et Aquamacs (http://aquamacs.org/).
Pour exécuter votre script depuis la fenêtre Terminal, vous devez vous assurer
que /usr/local/bin est dans le chemin de recherche de votre shell (PATH).
Pour exécuter votre script depuis le Finder vous avez deux options :
Glissez-le vers PythonLauncher
Sélectionnez PythonLauncher en tant qu'application par défaut pour ouvrir
votre script (ou n'importe quel script .py) depuis la fenêtre info de votre Finder puis
double-cliquez votre script. PythonLauncher a des préférences variées pour
contrôler comment votre script est exécuté. Glisser des options permets de les
changer pour une invocation, ou utilisez le menu Préférences pour changer les
choses globalement.
4.1.2. Lancer des scripts avec une interface graphique
Avec les anciennes versions de Python, il y a une bizarrerie Max OS X dont vous
devez être au courant : les programmes qui communiquent avec le gestionnaires de
fenêtre Aqua (en d'autres termes, tout ce qui a une interface graphique) doivent être
exécutés de façon spécifique. Utilisez pythonw au lieu de python pour exécuter ce
genre de scripts.
4.1.3. Configuration
Python sur OS X respecte tous les standards Unix pour les variables
d'environnement comme PYTHONPATH, mais définir ces variables pour des
programmes exécutés depuis le Finder n'est pas standard car le Finder ne lit pas
votre .profile ou .cshrc au démarrage. Vous devez créer un
fichier ~/.MacOSX/environment.plist. Voir le document technique d'Apple
QA1067 pour plus de détails.
4.2. L'IDE
MacPython est livré avec l'environnement de développement standard IDLE. Une
bonne introduction sur l’utilisation d'IDLE peut être trouvée
à http://www.hashcollision.org/hkn/python/idle_intro/index.html.
4.3. Installation de paquets Python additionnels
Il y a plusieurs méthodes pour installer des paquets Python supplémentaires :
PyQt est une boîte à outils multi-plateformes pour interfaces graphique populaire qui
tourne nativement sur Mac OS X. Plus d'informations disponible
sur https://riverbankcomputing.com/software/pyqt/intro.
https://www.python.org/community/sigs/current/pythonmac-sig/
https://wiki.python.org/moin/MacPython
1. Introduction
o 1.1. Autres implémentations
o 1.2. Notations
2. Analyse lexicale
o 2.1. Structure des lignes
o 2.2. Autres lexèmes
o 2.3. Identifiants et mots-clés
o 2.4. Littéraux
o 2.5. Opérateurs
o 2.6. Délimiteurs
3. Modèle de données
o 3.1. Objets, valeurs et types
o 3.2. Hiérarchie des types standards
o 3.3. Méthodes spéciales
o 3.4. Coroutines
4. Modèle d'exécution
o 4.1. Structure d'un programme
o 4.2. Noms et liaisons
o 4.3. Exceptions
5. Le système d'importation
o 5.1. importlib
o 5.2. Les paquets
o 5.3. Recherche
o 5.4. Chargement
o 5.5. Le chercheur dans path
o 5.6. Remplacement du système d'importation standard
o 5.7. Importations relatives au paquet
o 5.8. Cas particulier de __main__
o 5.9. Idées d'amélioration
o 5.10. Références
6. Expressions
o 6.1. Conversions arithmétiques
o 6.2. Atomes
o 6.3. Primaires
o 6.4. Expression await
o 6.5. L'opérateur puissance
o 6.6. Arithmétique unaire et opérations sur les bits
o 6.7. Opérations arithmétiques binaires
o 6.8. Opérations de décalage
o 6.9. Opérations binaires bit à bit
o 6.10. Comparaisons
o 6.11. Opérations booléennes
o 6.12. Expressions conditionnelles
o 6.13. Expressions lambda
o 6.14. Listes d'expressions
o 6.15. Ordre d'évaluation
o 6.16. Priorités des opérateurs
7. Les instructions simples
o 7.1. Les expressions
o 7.2. Les assignations
o 7.3. L'instruction assert
o 7.4. L'instruction pass
o 7.5. L'instruction del
o 7.6. L'instruction return
o 7.7. L'instruction yield
o 7.8. L'instruction raise
o 7.9. L'instruction break
o 7.10. L'instruction continue
o 7.11. L'instruction import
o 7.12. L'instruction global
o 7.13. L'instruction nonlocal
8. Instructions composées
o 8.1. L'instruction if
o 8.2. L'instruction while
o 8.3. L'instruction for
o 8.4. L'instruction try
o 8.5. L'instruction with
o 8.6. Définition de fonctions
o 8.7. Définition de classes
o 8.8. Coroutines
9. Composants de plus haut niveau
o 9.1. Programmes Python complets
o 9.2. Fichier d'entrée
o 9.3. Entrée interactive
o 9.4. Entrée d'expression
10. Spécification complète de la grammaire
1. Introduction
Ce manuel de référence décrit le langage de programmation Python. Il n'a pas
vocation à être un tutoriel.
Nous essayons d'être le plus précis possible et nous utilisons le français (NdT : ou
l’anglais pour les parties qui ne sont pas encore traduites) plutôt que des
spécifications formelles, sauf pour la syntaxe et l’analyse lexicale. Nous espérons
ainsi rendre ce document plus compréhensible pour un grand nombre de lecteurs,
même si cela laisse un peu de place à l’ambiguïté. En conséquence, si vous arrivez
de Mars et que vous essayez de ré-implémenter Python à partir de cet unique
document, vous devrez faire des hypothèses et, finalement, vous aurez certainement
implémenté un langage sensiblement différent. D’un autre côté, si vous utilisez
Python et que vous vous demandez quelles règles s’appliquent pour telle partie du
langage, vous devriez trouver une réponse satisfaisante ici. Si vous souhaitez voir
une définition plus formelle du langage, nous acceptons toutes les bonnes volontés
(ou bien inventez une machine pour nous cloner ☺).
1.1. Autres implémentations
Bien qu’il existe une implémentation Python qui soit de loin la plus populaire, il existe
d’autres implémentations qui présentent un intérêt particulier pour différents publics.
CPython
C’est l’implémentation originelle et la plus entretenue de Python, écrite en C. Elle
implémente généralement en premier les nouvelles fonctionnalités du langage.
Jython
Python implémenté en Java. Cette implémentation peut être utilisée comme langage
de script pour les applications Java ou pour créer des applications utilisant des
bibliothèques Java. Elle est également souvent utilisée pour créer des tests de
bibliothèques Java. Plus d’informations peuvent être trouvées sur the Jython
website (site en anglais).
IronPython
PyPy
Chacune de ces implémentations diffère d'une manière ou d'une autre par rapport au
langage décrit dans ce manuel, ou comporte des spécificités que la documentation
standard de Python ne couvre pas. Reportez-vous à la documentation spécifique à
l'implémentation pour déterminer ce que vous devez savoir sur l'implémentation que
vous utilisez.
1.2. Notations
Les descriptions de l'analyse lexicale et de la syntaxe utilisent une notation de
grammaire BNF modifiée. Le style utilisé est le suivant :
Chaque règle commence par un nom (qui est le nom que la règle définit) et ::=. Une
barre verticale (|) est utilisée pour séparer les alternatives ; c'est l'opérateur le moins
prioritaire de cette notation. Une étoile ( *) signifie zéro ou plusieurs répétitions de
l'élément précédent ; de même, un plus (+) signifie une ou plusieurs répétitions, et
une expression entre crochets ([ ]) signifie zéro ou une occurrence (en d'autres
termes, l'expression encadrée est facultative). Les opérateurs * et + agissent aussi
étroitement que possible ; les parenthèses sont utilisées pour le regroupement. Les
chaînes littérales sont entourées de guillemets anglais ". L'espace n'est utilisée que
pour séparer les lexèmes. Les règles sont normalement contenues sur une seule
ligne ; les règles avec de nombreuses alternatives peuvent être formatées avec
chaque ligne représentant une alternative (et donc débutant par une barre verticale,
sauf la première).
Dans les définitions lexicales (comme dans l'exemple ci-dessus), deux autres
conventions sont utilisées : deux caractères littéraux séparés par des points de
suspension signifient le choix d'un seul caractère dans la plage donnée (en incluant
les bornes) de caractères ASCII. Une phrase entre les signes inférieur et supérieur
(<...>) donne une description informelle du symbole défini ; par exemple, pour
décrire la notion de "caractère de contrôle" si nécessaire.
Même si la notation utilisée est presque la même, il existe une grande différence
entre la signification des définitions lexicales et syntaxiques : une définition lexicale
opère sur les caractères individuels de l'entrée, tandis qu'une définition syntaxique
opère sur le flux de lexèmes générés par l'analyse lexicale. Toutes les notations sous
la forme BNF dans le chapitre suivant (« Analyse lexicale ») sont des définitions
lexicales ; les notations dans les chapitres suivants sont des définitions syntaxiques.
2. Analyse lexicale
Un programme Python est lu par un analyseur syntaxique (parser en anglais). En
entrée de cet analyseur syntaxique, nous trouvons des lexèmes (tokens en anglais),
produits par un analyseur lexical. Ce chapitre décrit comment l'analyseur lexical
découpe le fichier en lexèmes.
2.1.1. Lignes logiques
La fin d'une ligne logique est représentée par le lexème NEWLINE. Les instructions
ne peuvent pas traverser les limites des lignes logiques, sauf quand NEWLINE est
autorisé par la syntaxe (par exemple, entre les instructions des instructions
composées). Une ligne logique est constituée d'une ou plusieurs lignes physiques en
fonction des règles, explicites ou implicites, de continuation de ligne.
2.1.2. Lignes physiques
Une ligne physique est une suite de caractères terminée par une séquence de fin de
ligne. Dans les fichiers sources et les chaînes de caractères, n'importe quelle
séquence de fin de ligne des plateformes standards peut être utilisée ; Unix utilise le
caractère ASCII LF (pour linefeed, saut de ligne en français), Windows utilise la
séquence CR LF (carriage return suivi de linefeed) et Macintosh utilisait le caractère
ASCII CR. Toutes ces séquences peuvent être utilisées, quelle que soit la
plateforme. La fin de l'entrée est aussi une fin de ligne physique implicite.
Lorsque vous encapsulez Python, les chaînes de code source doivent être passées
à l'API Python en utilisant les conventions du C standard pour les caractères de fin
de ligne : le caractère \n, dont le code ASCII est LF.
2.1.3. Commentaires
Un commentaire commence par le caractère croisillon ( #, hash en anglais et qui
ressemble au symbole musical dièse, c'est pourquoi il est souvent improprement
appelé caractère dièse) situé en dehors d'une chaine de caractères littérale et se
termine à la fin de la ligne physique. Un commentaire signifie la fin de la ligne logique
à moins qu'une règle de continuation de ligne implicite ne s'applique. Les
commentaires sont ignorés au niveau syntaxique, ce ne sont pas des lexèmes.
2.1.4. Déclaration d'encodage
Si un commentaire placé sur la première ou deuxième ligne du script Python
correspond à l'expression rationnelle coding[=:]\s*([-\w.]+), ce commentaire
est analysé comme une déclaration d'encodage ; le premier groupe de cette
expression désigne l'encodage du fichier source. Cette déclaration d'encodage doit
être seule sur sa ligne et, si elle est sur la deuxième ligne, la première ligne doit
aussi être une ligne composée uniquement d'un commentaire. Les formes
recommandées pour l'expression de l'encodage sont
# vim:fileencoding=<encoding-name>
Si aucune déclaration d'encodage n'est trouvée, l'encodage par défaut est utilisé :
UTF-8. En plus, si les premiers octets du fichier sont l'indicateur d'ordre des octets
UTF-8 (b'\xef\xbb\xbf', BOM en anglais pour byte order mark), le fichier est
considéré comme étant en UTF-8 (cette convention est reconnue, entre autres,
par notepad de Microsoft).
Si un encodage est déclaré, le nom de l'encodage doit être reconnu par Python.
L'encodage est utilisé pour toute l'analyse lexicale, y compris les chaînes de
caractères, les commentaires et les identifiants.
Une ligne que se termine par une barre oblique inversée ne peut pas avoir de
commentaire. La barre oblique inversée ne permet pas de continuer un
commentaire. La barre oblique inversée ne permet pas de continuer un lexème, sauf
s'il s'agit d'une chaîne de caractères (par exemple, les lexèmes autres que les
chaînes de caractères ne peuvent pas être répartis sur plusieurs lignes en utilisant
une barre oblique inversée). La barre oblique inversée n'est pas autorisée ailleurs sur
la ligne, en dehors d'une chaîne de caractères.
2.1.7. Lignes vierges
Une ligne logique qui ne contient que des espaces, tabulations, caractères de saut
de page (formfeed en anglais) ou commentaires est ignorée (c'est-à-dire que le
lexème NEWLINE n'est pas produit). Pendant l'édition interactive d'instructions, la
gestion des lignes vierges peut différer en fonction de l'implémentation de la boucle
REPL. Dans l'interpréteur standard, une ligne complètement vierge (c'est-à-dire ne
contenant strictement rien, même pas une espace ou un commentaire) termine une
instruction multi-lignes.
2.1.8. Indentation
Des espaces ou tabulations au début d’une ligne logique sont utilisées pour
connaître le niveau d’indentation de la ligne, qui est ensuite utilisé pour déterminer
comment les instructions sont groupées.
Les tabulations sont remplacées (de la gauche vers la droite) par une à huit espaces
de manière à ce que le nombre de caractères remplacés soit un multiple de huit
(nous avons ainsi la même règle que celle d'Unix). Le nombre total d'espaces
précédant le premier caractère non blanc détermine alors le niveau d'indentation de
la ligne. L'indentation ne peut pas être répartie sur plusieurs lignes physiques à l'aide
de barres obliques inversées ; les espaces jusqu'à la première barre oblique inversée
déterminent l'indentation.
L'indentation est déclarée inconsistante et rejetée si, dans un même fichier source, le
mélange des tabulations et des espaces est tel que la signification dépend du
nombre d'espaces que représente une tabulation. Une exception TabError est
levée dans ce cas.
Un caractère de saut de page peut être présent au début de la ligne ; il est ignoré
pour les calculs d'indentation ci-dessus. Les caractères de saut de page se trouvant
ailleurs avec les espaces en tête de ligne ont un effet indéfini (par exemple, ils
peuvent remettre à zéro le nombre d'espaces).
Les niveaux d'indentation de lignes consécutives sont utilisés pour générer les
lexèmes INDENT et DEDENT, en utilisant une pile, de cette façon :
Avant que la première ligne du fichier ne soit lue, un « zéro » est posé sur la pile ; il
ne sera plus jamais enlevé. Les nombres empilés sont toujours strictement
croissants de bas en haut. Au début de chaque ligne logique, le niveau d'indentation
de la ligne est comparé au sommet de la pile. S'ils sont égaux, il ne se passe rien.
S'il est plus grand, il est empilé et un lexème INDENT est produit. S'il est plus petit,
il doit être l'un des nombres présents dans la pile ; tous les nombres de la pile qui
sont plus grands sont retirés et, pour chaque nombre retiré, un lexème DEDENT est
produit. À la fin du fichier, un lexème DEDENT est produit pour chaque nombre
supérieur à zéro restant sur la pile.
Voici un exemple de code Python correctement indenté (bien que très confus) :
def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r
En fait, les trois premières erreurs sont détectées par l'analyseur syntaxique ; seule
la dernière erreur est trouvée par l'analyseur lexical (l'indentation de return r ne
correspond à aucun niveau dans la pile).
2.3. Identifiants et mots-clés
Les identifiants (aussi appelés noms) sont décrits par les définitions lexicales
suivantes.
La syntaxe des identifiants en Python est basée sur l'annexe UAX-31 du standard
Unicode avec les modifications définies ci-dessous ; consultez la PEP 3131 pour
plus de détails.
Dans l'intervalle ASCII (U+0001..U+007F), les caractères licites pour les identifiants
sont les mêmes que pour Python 2.x : les lettres minuscules et majuscules de A à Z,
le souligné (ou underscore) _ et, sauf pour le premier caractère, les chiffres de 0 à 9.
Les identifiants n'ont pas de limite de longueur. La casse est prise en compte.
Tous les identifiants sont convertis dans la forme normale NFKC pendant l'analyse
syntaxique : la comparaison des identifiants se base sur leur forme NFKC.
A non-normative HTML file listing all valid identifier characters for Unicode 4.1 can be
found at https://www.unicode.org/Public/13.0.0/ucd/DerivedCoreProperties.txt
2.3.1. Mots-clés
Les identifiants suivants sont des mots réservés par le langage et ne peuvent pas
être utilisés en tant qu'identifiants normaux. Ils doivent être écrits exactement comme
ci-dessous :
_*
L'identifiant spécial _ n'est pas importé par from module import *. Il est utilisé
dans l'interpréteur interactif pour stocker le résultat de la dernière évaluation ; il est
stocké dans le module builtins. Lorsque vous n'êtes pas en mode interactif, _ n'a
pas de signification particulière et n'est pas défini. Voir la section L'instruction import.
Note
__*
Noms privés pour une classe. Les noms de cette forme, lorsqu'ils sont utilisés dans
le contexte d'une définition de classe, sont réécrits sous une forme modifiée pour
éviter les conflits de noms entre les attributs « privés » des classes de base et les
classes dérivées. Voir la section Identifiants (noms).
2.4. Littéraux
Les littéraux sont des notations pour indiquer des valeurs constantes de certains
types natifs.
Une restriction syntaxique non indiquée par ces règles est qu'aucun blanc n'est
autorisé entre le stringprefix ou bytesprefix et le reste du littéral. Le jeu de
caractères source est défini par la déclaration d'encodage ; il vaut UTF-8 si aucune
déclaration d'encodage n'est donnée dans le fichier source ; voir la
section Déclaration d'encodage.
Description en français : les deux types de littéraux peuvent être encadrés par une
paire de guillemets simples (') ou doubles ("). Ils peuvent aussi être encadrés par
une paire de trois guillemets simples ou une paire de trois guillemets doubles (on
appelle alors généralement ces chaînes entre triples guillemets). La barre oblique
inversée peut être utilisée pour échapper des caractères qui auraient sinon une
signification spéciale, tels que le retour à la ligne, la barre oblique inversée elle-
même ou le guillemet utilisé pour délimiter la chaîne.
Les littéraux de suites d'octets sont toujours préfixés par 'b' ou 'B' ; cela crée une
instance de type bytes au lieu du type str. Ils ne peuvent contenir que des
caractères ASCII ; les octets dont la valeur est supérieure ou égale à 128 doivent
être exprimés à l'aide d'échappements.
Nouveau dans la version 3.3: le support du préfixe historique pour les chaînes
Unicode a été réintroduit afin de simplifier la maintenance de code compatible
Python 2.x et 3.x. Voir la PEP 414 pour davantage d'informations.
Dans les chaînes entre triples guillemets, les sauts de ligne et guillemets peuvent ne
pas être échappés (et sont donc pris en compte), mais trois guillemets non échappés
à la suite terminent le littéral (on entend par guillemet le caractère utilisé pour
commencer le littéral, c'est-à-dire ' ou ").
Séquence
Signification Notes
d'échappement
barre oblique inversée et retour à la ligne
\newline
ignorés
Séquence
Signification Notes
d'échappement
Notes :
1. Comme dans le C Standard, jusqu'à trois chiffres en base huit sont acceptés.
2. Contrairement au C Standard, il est obligatoire de fournir deux chiffres
hexadécimaux.
3. Dans un littéral de suite d'octets, un échappement hexadécimal ou octal est
un octet dont la valeur est donnée. Dans une chaîne littérale, un échappement est un
caractère Unicode dont le code est donné.
Même dans une chaîne littérale brute, les guillemets peuvent être échappés avec
une barre oblique inversée mais la barre oblique inversée reste dans le résultat ; par
exemple, r"\"" est une chaîne de caractères valide composée de deux caractères :
une barre oblique inversée et un guillemet double ; r"\" n'est pas une chaîne de
caractères valide (même une chaîne de caractères brute ne peut pas se terminer par
un nombre impair de barres obliques inversées). Plus précisément, une chaîne
littérale brute ne peut pas se terminer par une seule barre oblique inversée (puisque
la barre oblique inversée échappe le guillemet suivant). Notez également qu'une
simple barre oblique inversée suivie d'un saut de ligne est interprétée comme deux
caractères faisant partie du littéral et non comme une continuation de ligne.
Notez que cette fonctionnalité agit au niveau syntaxique mais est implémentée au
moment de la compilation. Pour concaténer les expressions des chaînes de
caractères au moment de l'exécution, vous devez utiliser l'opérateur +. Notez
également que la concaténation littérale peut utiliser un style différent de guillemets
pour chaque composant (et même mélanger des chaînes de caractères brutes et des
chaînes de caractères entre triples guillemets). Enfin, les chaînes de caractères
formatées peuvent être concaténées avec des chaînes de caractères ordinaires.
2.4.3. Chaînes de caractères formatées littérales
Nouveau dans la version 3.6.
Les portions qui sont en dehors des accolades sont traitées comme les littéraux, sauf
les doubles accolades '{{' ou '}}' qui sont remplacées par la simple accolade
correspondante. Une simple accolade ouvrante '{' marque le début du champ à
remplacer, qui commence par une expression Python. Après l'expression, il peut y
avoir un champ de conversion, introduit par un point d'exclamation '!'. Une
spécification de format peut aussi être ajoutée, introduite par le caractère deux-
points ':'. Le champ à remplacer se termine par une accolade fermante '}'.
Les expressions dans les chaînes de caractères formatées littérales sont traitées
comme des expressions Python normales entourées de parenthèses, à quelques
exceptions près. Une expression vide n'est pas autorisée et une
expression lambda doit être explicitement entourée de parenthèses. Les expressions
de remplacement peuvent contenir des sauts de ligne (par exemple dans les chaînes
de caractères entre triples guillemets) mais elles ne peuvent pas contenir de
commentaire. Chaque expression est évaluée dans le contexte où la chaîne de
caractères formatée apparaît, de gauche à droite.
Modifié dans la version 3.7: Prior to Python 3.7, an await expression and
comprehensions containing an async for clause were illegal in the expressions in
formatted string literals due to a problem with the implementation.
Les chaînes formatées littérales peuvent être concaténées mais les champs à
remplacer ne peuvent pas être divisés entre les littéraux.
>>>
La barre oblique inversée (ou antislash) n'est pas autorisée dans les expressions des
champs à remplacer et son utilisation génère une erreur :
Pour inclure une valeur où l'échappement par barre oblique inversée est nécessaire,
vous devez créer une variable temporaire.
Une chaine formatée littérale ne peut pas être utilisée en tant que docstring, même si
elle ne comporte pas d'expression.
>>>
Consultez aussi la PEP 498 qui propose l'ajout des chaines formatées littérales
et str.format() qui utilise un mécanisme similaire pour formater les chaînes de
caractères.
2.4.4. Littéraux numériques
Il existe trois types de littéraux numériques : les entiers, les nombres à virgule
flottante et les nombres imaginaires. Il n'y a pas de littéraux complexes (les nombres
complexes peuvent être construits en ajoutant un nombre réel et un nombre
imaginaire).
Notez que les littéraux numériques ne comportent pas de signe ; une phrase telle
que -1 est en fait une expression composée de l'opérateur unitaire - et du littéral 1.
2.4.5. Entiers littéraux
Les entiers littéraux sont décrits par les définitions lexicales suivantes :
Il n'y a pas de limite pour la longueur des entiers littéraux, sauf celle relative à la
capacité mémoire.
Les tirets bas sont ignorés pour déterminer la valeur numérique du littéral. Ils
peuvent être utilisés pour grouper les chiffres afin de faciliter la lecture. Un souligné
peut être placé entre des chiffres ou après la spécification de la base telle que 0x.
Notez que placer des zéros en tête de nombre pour un nombre décimal différent de
zéro n'est pas autorisé. Cela permet d'éviter l’ambigüité avec les littéraux en base
octale selon le style C que Python utilisait avant la version 3.0.
Modifié dans la version 3.6: Les tirets bas ne sont pas autorisés pour grouper les
littéraux.
Notez que la partie entière et l'exposant sont toujours interprétés comme étant en
base 10. Par exemple, 077e010 est licite et désigne le même nombre que 77e10. La
plage autorisée pour les littéraux de nombres à virgule flottante dépend de
l'implémentation. Comme pour les entiers littéraux, les soulignés permettent de
grouper des chiffres.
Modifié dans la version 3.6: Les tirets bas ne sont pas autorisés pour grouper les
littéraux.
2.4.7. Imaginaires littéraux
Les nombres imaginaires sont décrits par les définitions lexicales suivantes :
Un littéral imaginaire produit un nombre complexe dont la partie réelle est 0.0. Les
nombres complexes sont représentés comme une paire de nombres à virgule
flottante et possèdent les mêmes restrictions concernant les plages autorisées. Pour
créer un nombre complexe dont la partie réelle est non nulle, ajoutez un nombre à
virgule flottante à votre littéral imaginaire. Par exemple (3+4j). Voici d'autres
exemples de littéraux imaginaires :
2.5. Opérateurs
Les lexèmes suivants sont des opérateurs :
+ - * ** / // % @
<< >> & | ^ ~
< > <= >= == !=
2.6. Délimiteurs
Les lexèmes suivants servent de délimiteurs dans la grammaire :
( ) [ ] { }
, : . ; @ = ->
+= -= *= /= //= %= @=
&= |= ^= >>= <<= **=
Le point peut aussi apparaître dans les littéraux de nombres à virgule flottante et
imaginaires. Une suite de trois points possède une signification spéciale : c'est une
ellipse littérale. La deuxième partie de la liste, les opérateurs d'assignation
augmentés, servent de délimiteurs pour l'analyseur lexical mais sont aussi des
opérateurs.
Les caractères ASCII suivants ont une signification spéciale en tant que partie
d'autres lexèmes ou ont une signification particulière pour l'analyseur lexical :
' " # \
Les caractères ASCII suivants ne sont pas utilisés en Python. S'ils apparaissent en
dehors de chaines littérales ou de commentaires, ils produisent une erreur :
$ ? `
Notes
1 http://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt
3. Modèle de données
3.1. Objets, valeurs et types
Objects are Python's abstraction for data. All data in a Python program is
represented by objects or by relations between objects. (In a sense, and in
conformance to Von Neumann's model of a "stored program computer", code is also
represented by objects.)
Le type de l'objet détermine les opérations que l'on peut appliquer à l'objet (par
exemple, « a-t-il une longueur ? ») et définit aussi les valeurs possibles pour les
objets de ce type. La fonction type() renvoie le type de l'objet (qui est lui-même un
objet). Comme l'identifiant, le type d'un objet ne peut pas être modifié 1.
La valeur de certains objets peut changer. Les objets dont la valeur peut changer
sont dits muables (mutable en anglais) ; les objets dont la valeur est définitivement
fixée à leur création sont dits immuables (immutable en anglais). La valeur d'un objet
conteneur immuable qui contient une référence vers un objet muable peut varier
lorsque la valeur de l'objet muable change ; cependant, le conteneur est quand
même considéré comme immuable parce que l'ensemble des objets qu'il contient ne
peut pas être modifié. Ainsi, l'immuabilité n'est pas strictement équivalente au fait
d'avoir une valeur non modifiable, c'est plus subtil. La muabilité d'un objet est définie
par son type ; par exemple, les nombres, les chaînes de caractères et les tuples sont
immuables alors que les dictionnaires et les listes sont muables.
Un objet n'est jamais explicitement détruit ; cependant, lorsqu'il ne peut plus être
atteint, il a vocation à être supprimé par le ramasse-miettes (garbage-collector en
anglais). L'implémentation peut retarder cette opération ou même ne pas la faire du
tout — la façon dont fonctionne le ramasse-miette est particulière à chaque
implémentation, l'important étant qu'il ne supprime pas d'objet qui peut encore être
atteint.
Certains objets font référence à des ressources « externes » telles que des fichiers
ouverts ou des fenêtres. Ces objets libèrent ces ressources au moment où ils sont
supprimés, mais comme le ramasse-miettes ne garantit pas qu'il supprime tous les
objets, ces objets fournissent également un moyen explicite de libérer la ressource
externe, généralement sous la forme d'une méthode close(). Nous incitons
fortement les programmeurs à fermer explicitement de tels objets. Les
instructions try...finally et with sont très pratiques pour cela.
Presque tous les comportements d'un objet dépendent du type de l'objet. Même son
identifiant est concerné dans un certain sens : pour les types immuables, les
opérations qui calculent de nouvelles valeurs peuvent en fait renvoyer une référence
à n'importe quel objet existant avec le même type et la même valeur, alors que pour
les objets muables cela n'est pas autorisé. Par exemple,
après a = 1 ; b = 1, a et b peuvent ou non se référer au même objet avec la
valeur un, en fonction de l'implémentation. Mais après c = [] ; d = [], il est
garanti que c et d font référence à deux listes vides distinctes nouvellement créées.
Notez que c = d = [] attribue le même objet à c et d.
None
Ce type ne possède qu'une seule valeur. Il n'existe qu'un seul objet avec cette
valeur. Vous accédez à cet objet avec le nom natif None. Il est utilisé pour signifier
l'absence de valeur dans de nombreux cas, par exemple pour des fonctions qui ne
retournent rien explicitement. Sa valeur booléenne est fausse.
NotImplemented
Ce type ne possède qu'une seule valeur. Il n'existe qu'un seul objet avec cette
valeur. Vous accédez à cet objet avec le nom natif NotImplemented. Les méthodes
numériques et les comparaisons riches doivent renvoyer cette valeur si elles
n'implémentent pas l'opération pour les opérandes fournis (l'interpréteur essaie alors
l'opération en permutant les opérandes ou tout autre stratégie de contournement, en
fonction de l'opérateur). Sa valeur booléenne est vraie.
Ellipse
Ce type ne possède qu'une seule valeur. Il n'existe qu'un seul objet avec cette
valeur. Vous accédez à cet objet avec le littéral ... ou le nom natif Ellipsis. Sa
valeur booléenne est vraie.
numbers.Number
Ces objets sont créés par les littéraux numériques et renvoyés en tant que résultats
par les opérateurs et les fonctions arithmétiques natives. Les objets numériques sont
immuables ; une fois créés, leur valeur ne change pas. Les nombres Python sont
bien sûr très fortement corrélés aux nombres mathématiques mais ils sont soumis
aux limitations des représentations numériques par les ordinateurs.
Python distingue les entiers, les nombres à virgule flottante et les nombres
complexes :
numbers.Integral
Ils représentent les nombres, sans limite de taille, sous réserve de pouvoir être
stockés en mémoire (virtuelle). Afin de pouvoir effectuer des décalages et appliquer
des masques, on considère qu'ils ont une représentation binaire. Les nombres
négatifs sont représentés comme une variante du complément à 2, qui donne
l'illusion d'une chaîne infinie de bits de signe s'étendant vers la gauche.
Booléens (bool)
Les règles pour la représentation des entiers ont pour objet de donner l'interprétation
la plus naturelle pour les opérations de décalage et masquage qui impliquent des
entiers négatifs.
numbers.Real (float)
Ils représentent les nombres à virgule flottante en double précision, tels que
manipulés directement par la machine. Vous dépendez donc de l'architecture
machine sous-jacente (et de l'implémentation C ou Java) pour les intervalles gérés et
le traitement des débordements. Python ne gère pas les nombres à virgule flottante
en précision simple ; les gains en puissance de calcul et mémoire, qui sont
généralement la raison de l'utilisation des nombres en simple précision, sont
annihilés par le fait que Python encapsule de toute façon ces nombres dans des
objets. Il n'y a donc aucune raison de compliquer le langage avec deux types de
nombres à virgule flottante.
numbers.Complex (complex)
Ils représentent les nombres complexes, sous la forme d'un couple de nombres à
virgule flottante en double précision, tels que manipulés directement par la machine.
Les mêmes restrictions s'appliquent que pour les nombres à virgule flottante. La
partie réelle et la partie imaginaire d'un nombre complexe z peuvent être demandées
par les attributs en lecture seule z.real et z.imag.
Séquences
Ils représentent des ensembles de taille finie indicés par des entiers positifs ou nuls.
La fonction native len() renvoie le nombre d'éléments de la séquence. Quand la
longueur d'une séquence est n, l'ensemble des indices contient les entiers 0, 1 ..., n-
1. On accède à l'élément d'indice i de la séquence a par a[i].
Séquences immuables
Un objet de type de séquence immuable ne peut pas être modifié une fois qu'il a été
créé. Si l'objet contient des références à d'autres objets, ces autres objets peuvent
être muables et peuvent être modifiés ; cependant, les objets directement référencés
par un objet immuable ne peuvent pas être modifiés.
Chaînes de caractères
Une chaîne de caractères (string en anglais) est une séquence de valeurs qui
représentent des caractères Unicode. Tout caractère dont le code est dans
l'intervalle U+0000 - U+10FFFF peut être représenté dans une chaîne. Python ne
possède pas de type char ; à la place, chaque caractère Unicode dans la chaîne est
représenté par un objet chaîne de longueur 1. La fonction native ord() convertit un
caractère Unicode de la représentation en chaîne vers un entier dans
l'intervalle 0 - 10FFFF ; la fonction chr() convertit un entier de
l'intervalle 0 - 10FFFF vers l'objet chaîne de
longueur 1 correspondant. str.encode() peut être utilisée pour convertir un
objet str vers bytes selon l'encodage spécifié et bytes.decode() effectue
l'opération inverse.
Les éléments d'un tuple sont n'importe quels objets Python. Les tuples de deux ou
plus éléments sont formés par une liste d'expressions dont les éléments sont
séparés par des virgules. Un tuple composé d'un seul élément (un « singleton ») est
formé en suffixant une expression avec une virgule (une expression en tant que telle
ne crée pas un tuple car les parenthèses doivent rester disponibles pour grouper les
expressions). Un tuple vide peut être formé à l'aide d'une paire de parenthèses vide.
Bytes
Les objets bytes sont des tableaux immuables. Les éléments sont des octets (donc
composés de 8 bits), représentés par des entiers dans l'intervalle 0 à 255 inclus. Les
littéraux bytes (tels que b'abc') et la fonction native constructeur bytes() peuvent
être utilisés pour créer des objets bytes. Aussi, un objet bytes peut être décodé vers
une chaîne via la méthode decode().
Séquences muables
Les séquences muables peuvent être modifiées après leur création. Les notations de
tranches et de sous-ensembles peuvent être utilisées en tant que cibles d'une
assignation ou de l'instruction del (suppression).
Listes
N'importe quel objet Python peut être élément d'une liste. Les listes sont créées en
plaçant entre crochets une liste d'expressions dont les éléments sont séparés par
des virgules (notez que les listes de longueur 0 ou 1 ne sont pas des cas
particuliers).
Tableaux d'octets
Ensembles
Ils représentent les ensembles d'objets, non ordonnés, finis et dont les éléments sont
uniques. Tels quels, ils ne peuvent pas être indicés. Cependant, il est possible
d'itérer dessus et la fonction native len() renvoie le nombre d'éléments de
l'ensemble. Les utilisations classiques des ensembles sont les tests d'appartenance
rapides, la suppression de doublons dans une séquence et le calcul d'opérations
mathématiques telles que l'intersection, l'union, la différence et le complémentaire.
Pour les éléments des ensembles, les mêmes règles concernant l'immuabilité
s'appliquent que pour les clés de dictionnaires. Notez que les types numériques
obéissent aux règles normales pour les comparaisons numériques : si deux nombres
sont égaux (pour l'opération de comparaison, par exemple 1 et 1.0), un seul élément
est conservé dans l'ensemble.
Ensembles
Ils représentent les ensembles muables. Un ensemble est créé par la fonction native
constructeur set() et peut être modifié par la suite à l'aide de différentes méthodes,
par exemple add().
Ensembles gelés
Ils représentent les ensembles immuables. Ils sont créés par la fonction native
constructeur frozenset(). Comme un ensemble gelé est immuable et hachable, il
peut être utilisé comme élément d'un autre ensemble ou comme clé de dictionnaire.
Tableaux de correspondances
Ils représentent les ensembles finis d'objets indicés par des ensembles index
arbitraires. La notation a[k] sélectionne l'élément indicé par k dans le tableau de
correspondance a ; elle peut être utilisée dans des expressions, comme cible d'une
assignation ou avec l'instruction del. La fonction native len() renvoie le nombre
d'éléments du tableau de correspondances.
Il n'existe actuellement qu'un seul type natif pour les tableaux de correspondances :
Dictionnaires
Ils représentent les ensembles finis d'objets indicés par des valeurs presque
arbitraires. Les seuls types de valeurs non reconnus comme clés sont les valeurs
contenant des listes, des dictionnaires ou les autres types muables qui sont
comparés par valeur plutôt que par l'identifiant de l'objet. La raison de cette limitation
est qu'une implémentation efficace de dictionnaire requiert que l'empreinte par
hachage des clés reste constante dans le temps. Les types numériques obéissent
aux règles normales pour les comparaisons numériques : si deux nombres sont
égaux pour l'opération de comparaison, par exemple 1 et 1.0, alors ces deux
nombres peuvent être utilisés indifféremment pour désigner la même entrée du
dictionnaire.
Dictionaries preserve insertion order, meaning that keys will be produced in the same
order they were added sequentially over the dictionary. Replacing an existing key
does not change the order, however removing a key and re-inserting it will add it to
the end instead of keeping its old place.
Modifié dans la version 3.7: Dictionaries did not preserve insertion order in versions
of Python before 3.6. In CPython 3.6, insertion order was preserved, but it was
considered an implementation detail at that time rather than a language guarantee.
Types appelables
Ce sont les types sur lesquels on peut faire un appel de fonction (lisez la
section Appels) :
Fonctions allogènes
Un objet fonction allogène (ou fonction définie par l'utilisateur, mais ce n'est pas
forcément l'utilisateur courant qui a défini cette fonction) est créé par la définition
d'une fonction (voir la section Définition de fonctions). Il doit être appelé avec une
liste d'arguments contenant le même nombre d'éléments que la liste des paramètres
formels de la fonction.
Attributs spéciaux :
Attribut Signification
Accessible
__name__ Nom de la fonction
en écriture
Méthodes d'instances
Un objet méthode d'instance combine une classe, une instance de classe et tout
objet appelable (normalement une fonction définie par l'utilisateur).
Les méthodes savent aussi accéder (mais pas modifier) les attributs de la fonction de
l'objet fonction sous-jacent.
Les objets méthodes définies par l'utilisateur peuvent être créés quand vous
récupérez un attribut de classe (par exemple via une instance de cette classe) si cet
attribut est un objet fonction définie par l'utilisateur ou un objet méthode de classe.
Quand un objet méthode d'instance est créé à partir d'un objet fonction définie par
l'utilisateur via une des instances, son attribut __self__ est l'instance et l'objet
méthode est réputé lié. Le nouvel attribut de la méthode __func__ est l'objet
fonction original.
Quand un objet méthode définie par l'utilisateur est créé à partir d'un autre objet
méthode de la classe ou de l'instance, son comportement est identique à l'objet
fonction sauf pour l'attribut __func__ de la nouvelle instance qui n'est pas l'objet
méthode original mais son attribut __func__.
Quand un objet méthode d'instance est créé à partir d'un autre objet méthode de la
classe ou de l'instance, son attribut __self__ est la classe elle-même et son
attribut __func__ est l'objet fonction sous-jacent la méthode de classe.
Quand un objet méthode d'instance est dérivé à partir d'un objet méthode de classe,
l'instance de classe stockée dans __self__ est en fait la classe elle-même. Ainsi,
appeler x.f(1) ou C.f(1) est équivalent à appeler f(C, 1) où f est la fonction
sous-jacente.
Fonctions générateurs
Fonctions coroutines
Un objet fonction native est une enveloppe autour d'une fonction C. Nous pouvons
citer len() et math.sin() (math est un module standard natif) comme fonctions
natives. Le nombre et le type des arguments sont déterminés par la fonction C. Des
attributs spéciaux en lecture seule existent : __doc__ contient la chaîne de
documentation de la fonction (ou None s'il n'y en a pas) ; __name__ est le nom de la
fonction ; __self__ est défini à None ; __module__ est le nom du module où la
fonction est définie ou None s'il n'est pas disponible.
Méthodes natives
Ce sont des fonctions natives déguisées, contenant un objet passé à une fonction C
en tant qu'argument supplémentaire implicite. Un exemple de méthode native
est une_liste.append() (une_liste étant un objet liste). Dans ce cas, l'attribut
spécial en lecture seule __self__ est défini à l'objet une_liste.
Classes
Les classes sont des appelables. Ces objets sont normalement utilisés pour créer
des instances d'elles-mêmes mais des variations sont possibles pour les types de
classes qui surchargent __new__(). Les arguments de l'appel sont passés
à __new__() et, dans le cas classique, __new__() initialise une nouvelle instance.
Instances de classe
Les instances d'une classe peuvent devenir des appelables si vous définissez la
méthode __call__() de leur classe.
Modules
Les modules constituent l'organisation de base du code Python et sont créés par
le mécanisme d'import soit avec l'instruction import, soit en appelant des fonctions
telles que importlib.import_module() ou la fonction native __import__(). Un
objet module possède un espace de nommage implémenté par un objet dictionnaire
(c'est le dictionnaire référencé par l'attribut __globals__ des fonctions définies dans
le module). Les références à un attribut sont traduites en recherches dans ce
dictionnaire, par exemple m.x est équivalent à m.__dict__["x"]. Un objet module
ne contient pas l'objet code utilisé pour initialiser le module (puisque celui-ci n'est
plus nécessaire une fois l'initialisation terminée).
Le type d'une classe déclarée par le développeur est créé au moment de la définition
de la classe (voir la section Définition de classes). Une classe possède un espace de
nommage implémenté sous la forme d'un objet dictionnaire. Les références vers les
attributs de la classe sont traduits en recherches dans ce dictionnaire, par
exemple C.x est traduit en C.__dict__["x"] (bien qu'il existe un certain nombre
de fonctions automatiques qui permettent de trouver des attributs par d'autres
moyens). Si le nom d'attribut n'est pas trouvé dans ce dictionnaire, la recherche
continue dans les classes de base. Les classes de base sont trouvées en utilisant
l'ordre de résolution des méthodes (method resolution order en anglais, ou
MRO) C3 qui a un comportement cohérent même en présence d'héritages en
"diamant", où différentes branches d'héritages conduisent vers un ancêtre commun.
Vous trouverez plus de détails sur l'ordre de résolution des méthodes MRO C3 utilisé
par Python dans la documentation de la version 2.3 disponible
sur https://www.python.org/download/releases/2.3/mro/.
Quand une référence à un attribut de classe (disons la classe C) pointe vers un objet
méthode de classe, elle est transformée en objet méthode d'instance dont
l'attribut __self__ est C. Quand elle pointe vers un objet méthode statique, elle est
transformée en objet encapsulé par l'objet méthode statique. Reportez-vous à la
section Implémentation de descripteurs pour une autre manière dont les attributs
d'une classe diffèrent de ceux réellement contenus dans son __dict__.
Les assignations d'un attribut de classe mettent à jour le dictionnaire de la classe,
jamais le dictionnaire d'une classe de base.
Un objet classe peut être appelé (voir ci-dessus) pour produire une instance de
classe (voir ci-dessous).
Instances de classes
Une instance de classe est créée en appelant un objet classe (voir ci-dessus). Une
instance de classe possède un espace de nommage implémenté sous la forme d'un
dictionnaire qui est le premier endroit où sont recherchées les références aux
attributs. Quand un attribut n'est pas trouvé dans ce dictionnaire et que la classe de
l'instance contient un attribut avec ce nom, la recherche continue avec les attributs
de la classe. Si un attribut de classe est trouvé et que c'est un objet fonction définie
par l'utilisateur, il est transformé en objet méthode d'instance dont
l'attribut __self__ est l'instance. Les objets méthodes statiques et méthodes de
classe sont aussi transformés ; reportez-vous ci-dessous à « Classes ». Lisez la
section Implémentation de descripteurs pour une autre façon de récupérer les
attributs d'une classe, où la récupération via ses instances peut différer des objets
réellement stockés dans le __dict__ de la classe. Si aucun attribut de classe n'est
trouvé et que la classe de l'objet possède une méthode __getattr__(), cette
méthode est appelée pour rechercher une correspondance.
Les instances de classes peuvent prétendre être des nombres, des séquences ou
des tableaux de correspondance si elles ont des méthodes avec des noms spéciaux.
Voir la section Méthodes spéciales.
Types internes
Objets Code
Objets cadres
Un objet cadre représente le cadre d'exécution. Il apparait dans des objets traces
(voir plus loin) et est passé comme argument aux fonctions de traçage actives.
frame.clear()
Cette méthode efface toutes les références aux variables locales conservées dans le
cadre. Par ailleurs, si le cadre est celui d'un générateur, le générateur se termine.
Ceci permet de casser des références cycliques qui incluent des objets cadres (par
exemple, lors de la capture d'une exception et du stockage de la pile d'appels pour
une utilisation future).
Objets traces
Les objets traces représentent la pile de traces d'une exception. Un objet trace est
implicitement créé quand une exception apparaît et peut être explicitement créé en
appelant types.TracebackType.
Modifié dans la version 3.7: Les objets de traces d'appels peuvent maintenant être
explicitement instanciés depuis le code Python et l'attribut tb_next des instances
existantes peut être mis à jour.
Objets tranches
slice.indices(self, length)
3.3. Méthodes spéciales
Une classe peut implémenter certaines opérations que l'on invoque par une syntaxe
spéciale (telles que les opérations arithmétiques ou la découpe en tranches) en
définissant des méthodes aux noms particuliers. C'est l'approche utilisée par Python
pour la surcharge d'opérateur, permettant à une classe de définir son propre
comportement vis-à-vis des opérateurs du langage. Par exemple, si une classe
définit une méthode __getitem__() et que x est une instance de cette classe,
alors x[i] est globalement équivalent à type(x).__getitem__(x, i). Sauf
lorsque c'est mentionné, toute tentative d'appliquer une opération alors que la
méthode appropriée n'est pas définie lève une exception
(typiquement AttributeError ou TypeError).
Lorsque vous implémentez une classe qui émule un type natif, il est important que
cette émulation n'implémente que ce qui fait sens pour l'objet qui est modélisé. Par
exemple, la recherche d'éléments individuels d'une séquence peut faire sens, mais
pas l'extraction d'une tranche (un exemple est l'interface de NodeList dans le
modèle objet des documents W3C).
3.3.1. Personnalisation de base
object.__new__(cls[, ...])
object.__init__(self[, ...])
object.__del__(self)
Appelée au moment où une instance est sur le point d'être détruite. On l'appelle
aussi finaliseur ou (improprement) destructeur. Si une classe de base possède une
méthode __del__(), la méthode __del__() de la classe dérivée, si elle existe, doit
explicitement l'appeler pour s'assurer de l'effacement correct de la partie classe de
base de l'instance.
Il n'est pas garanti que soient appelées les méthodes __del__() des objets qui
existent toujours quand l'interpréteur termine.
Note
Documentation du module gc.
Avertissement
Cette fonction est principalement utilisée à fins de débogage, il est donc important
que la représentation donne beaucoup d'informations et ne soit pas ambigüe.
object.__str__(self)
object.__bytes__(self)
object.__format__(self, format_spec)
object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)
object.__hash__(self)
Appelée par la fonction native hash() et par les opérations sur les membres de
collections hachées (ce qui comprend set, frozenset et dict). __hash__() doit
renvoyer un entier. La seule propriété requise est que les objets qui sont égaux pour
la comparaison doivent avoir la même valeur de hachage ; il est conseillé de
mélanger les valeurs de hachage des composants d'un objet qui jouent un rôle de la
comparaison des objets, en les plaçant un tuple dont on calcule l'empreinte. Par
exemple :
def __hash__(self):
return hash((self.name, self.nick, self.color))
Note
Note
Voir aussi PYTHONHASHSEED.
Modifié dans la version 3.3: la randomisation des empreintes est activée par défaut.
object.__bool__(self)
Appelée pour implémenter les tests booléens et l'opération native bool() ; elle doit
renvoyer False ou True. Quand cette méthode n'est pas définie, __len__() est
appelée, si elle est définie, et l'objet est considéré vrai si le résultat est non nul. Si
une classe ne définit ni __len__() ni __bool__(), toutes ses instances sont
considérées comme vraies.
object.__getattr__(self, name)
object.__getattribute__(self, name)
Appelée de manière inconditionnelle pour implémenter l'accès aux attributs des
instances de la classe. Si la classe définit également __getattr__(), cette dernière
n'est pas appelée à moins que __getattribute__() ne l'appelle explicitement ou
ne lève une exception AttributeError. Cette méthode doit renvoyer la valeur
(calculée) de l'attribut ou lever une exception AttributeError. Afin d'éviter une
récursion infinie sur cette méthode, son implémentation doit toujours appeler la
méthode de la classe de base avec le même paramètre name pour accéder à
n'importe quel attribut dont elle a besoin. Par
exemple, object.__getattribute__(self, name).
Note
Cette méthode peut être shuntée lorsque la recherche porte sur les méthodes
spéciales en tant que résultat d'une invocation implicite via la syntaxe du langage ou
les fonctions natives. Lisez Recherche des méthodes spéciales.
object.__setattr__(self, name, value)
Appelée lors d'une assignation d'attribut. Elle est appelée à la place du mécanisme
normal (c'est-à-dire stocker la valeur dans le dictionnaire de l'instance). name est le
nom de l'attribut, value est la valeur à assigner à cet attribut.
object.__delattr__(self, name)
object.__dir__(self)
Pour une personnalisation plus fine du comportement d'un module (assignation des
attributs, propriétés, etc.), vous pouvez assigner l'attribut __class__ d'un objet
module à une sous-classe de types.ModuleType. Par exemple :
import sys
from types import ModuleType
class VerboseModule(ModuleType):
def __repr__(self):
return f'Verbose {self.__name__}'
sys.modules[__name__].__class__ = VerboseModule
Note
Voir aussi
PEP 562 — __getattr__ et __dir__ pour un module
Les méthodes qui suivent s'appliquent seulement quand une instance de la classe
(dite classe descripteur) contenant la méthode apparaît dans une
classe propriétaire (owner en anglais) ; la classe descripteur doit figurer dans le
dictionnaire de la classe propriétaire ou dans le dictionnaire de la classe d'un des
parents. Dans les exemples ci-dessous, « l'attribut » fait référence à l'attribut dont le
nom est une clé du __dict__ de la classe propriétaire.
object.__get__(self, instance, owner)
object.__set__(self, instance, value)
object.__delete__(self, instance)
object.__set_name__(self, owner, name)
Note
Le comportement par défaut pour la gestion d'un attribut est de définir, obtenir et
supprimer cet attribut du dictionnaire de l'objet. Par exemple, pour a.x Python
commence d'abord par rechercher a.__dict__['x'],
puis type(a).__dict__['x'] ; ensuite Python continue en remontant les classes
de base de type(a), en excluant les méta-classes.
Cependant, si la valeur cherchée est un objet qui définit une des méthodes de
descripteur, alors Python modifie son comportement et invoque la méthode du
descripteur à la place. Le moment où cela intervient dans la recherche citée ci-
dessus dépend de l'endroit où a été définie la méthode de descripteur et comment
elle a été appelée.
Appel direct
Le plus simple et le plus rare des appels est quand l'utilisateur code directement
l'appel à la méthode du descripteur : x.__get__(a).
Liaison super
Pour des liaisons avec des instances, la priorité à l'invocation du descripteur dépend
des méthodes que le descripteur a définies. Un descripteur peut définir n'importe
quelle combinaison de __get__(), __set__() et __delete__(). S'il ne définit
pas __get__(), alors accéder à l'attribut retourne l'objet descripteur lui-même sauf
s'il existe une valeur dans le dictionnaire de l'objet instance. Si le descripteur
définit __set__() ou __delete__(), c'est un descripteur de données ; s'il ne définit
aucune méthode, c'est un descripteur hors-donnée. Normalement, les descripteurs
de données définissent à la fois __get__() et __set__(), alors que les
descripteurs hors-données définissent seulement la méthode __get__(). Les
descripteurs de données qui définissent __set__() et __get__() sont toujours
prioritaires face à une redéfinition du dictionnaire de l'instance. En revanche, les
descripteurs hors-données peuvent être shuntés par les instances.
3.3.2.4. __slots__
object.__slots__
Cette variable de classe peut être assignée avec une chaîne, un itérable ou une
séquence de chaînes avec les noms de variables utilisés par les
instances. __slots__ réserve de la place pour ces variables déclarées et interdit la
création automatique de __dict__ et __weakref__ pour chaque instance.
classmethod object.__init_subclass__(cls)
Les arguments nommés qui sont donnés à la nouvelle classe sont passés
à __init_subclass__ de la classe parente. Par souci de compatibilité avec les
autres classes qui utilisent __init_subclass__, vous devez enlever les arguments
nommés dont vous avez besoin et passer les autres à la classe de base, comme ci-
dessous :
class Philosopher:
def __init_subclass__(cls, default_name, **kwargs):
super().__init_subclass__(**kwargs)
cls.default_name = default_name
Note
3.3.3.1. Méta-classes
Par défaut, les classes sont construites en utilisant type(). Le corps de la classe est
exécuté dans un nouvel espace de nommage et le nom de la classe est lié
localement au résultat de type(name, bases, namespace)`.
class Meta(type):
pass
class MyClass(metaclass=Meta):
pass
class MySubclass(MyClass):
pass
Tout autre argument nommé spécifié dans la définition de la classe est passé aux
opérations de méta-classes décrites auparavant.
Quand la définition d'une classe est exécutée, les différentes étapes suivies sont :
Si une classe de base qui apparaît dans la définition d'une classe n'est pas une
instance de type, alors Python y recherche une méthode __mro_entries__. S'il la
trouve, il l'appelle avec le tuple original des classes de bases. Cette méthode doit
renvoyer un tuple de classes qui est utilisé à la place de la classe de base. Le tuple
peut être vide, dans ce cas la classe de base originale est ignorée.
Voir aussi
PEP 560 — Gestion de base pour les types modules et les types génériques
3.3.3.3. Détermination de la méta-classe appropriée
Once the appropriate metaclass has been identified, then the class namespace is
prepared. If the metaclass has a __prepare__ attribute, it is called
as namespace = metaclass.__prepare__(name, bases, **kwds) (where the
additional keyword arguments, if any, come from the class definition).
The __prepare__ method should be implemented as a classmethod(). The
namespace returned by __prepare__ is passed in to __new__, but when the final
class object is created the namespace is copied into a new dict.
Voir aussi
PEP 3115 — Méta-classes dans Python 3000
Cependant, même quand une définition de classe intervient dans une fonction, les
méthodes définies à l'intérieur de la classe ne peuvent pas voir les noms définis en
dehors de la portée de la classe. On accède aux variables de la classe via le premier
paramètre des méthodes d'instance ou de classe, ou via la référence
implicite __class__ incluse dans la portée lexicale et décrite dans la section
suivante.
Cet objet classe est celui qui est référencé par la forme sans argument
de super(). __class__ est une référence implicite créée par le compilateur si une
méthode du corps de la classe fait référence soit à __class__, soit à super. Ceci
permet que la forme sans argument de super() identifie la classe en cours de
définition en fonction de la portée lexicale, tandis que la classe ou l'instance utilisée
pour effectuer l'appel en cours est identifiée en fonction du premier argument
transmis à la méthode.
Quand vous utilisez la méta-classe par défaut type ou toute autre méta-classe qui
finit par appeler type.__new__, les étapes de personnalisation supplémentaires
suivantes sont suivies après la création de l'objet classe :
Quand une nouvelle classe est créée via type.__new__, l'objet fourni en tant que
paramètre d'espace de nommage est copié vers un nouveau tableau de
correspondances ordonné et l'objet original est laissé de côté. La nouvelle copie est
encapsulée dans un mandataire en lecture seule qui devient l'attribut __dict__ de
l'objet classe.
Voir aussi
PEP 3135 — Nouvelle méthode super
Les utilisations possibles des méta-classes sont immenses. Quelques pistes ont déjà
été explorées comme l'énumération, la gestion des traces, le contrôle des interfaces,
la délégation automatique, la création automatique de propriétés, les mandataires,
les frameworks ainsi que le verrouillage ou la synchronisation automatique de
ressources.
class.__instancecheck__(self, instance)
Notez que ces méthodes sont recherchées dans le type (la méta-classe) d'une
classe. Elles ne peuvent pas être définies en tant que méthodes de classe dans la
classe réelle. C'est cohérent avec la recherche des méthodes spéciales qui sont
appelées pour les instances, sauf qu'ici l'instance est elle-même une classe.
Voir aussi
PEP 3119 — Introduction aux classes de bases abstraites
classmethod object.__class_getitem__(cls, key)
Python recherche cette méthode dans l'objet de classe lui-même et, lorsqu'elle est
définie dans le corps de la classe, cette méthode est implicitement une méthode de
classe. Notez que ce mécanisme est principalement réservé à une utilisation avec
des indications de type statiques, d'autres utilisations sont déconseillées.
Voir aussi
PEP 560 — Gestion de base pour les types modules et les types génériques
3.3.6. Émulation d'objets appelables
object.__call__(self[, args...])
Appelée quand l'instance est « appelée » en tant que fonction ; si la méthode est
définie, x(arg1, arg2, ...) est un raccourci
pour x.__call__(arg1, arg2, ...).
object.__len__(self)
Note
est traduit en
a[slice(1, 2, None)] = b
Appelée pour implémenter l'évaluation de self[key]. Pour les types séquences, les
clés autorisées sont les entiers et les objets tranches (slice). Notez que
l'interprétation spéciale des indices négatifs (si la classe souhaite émuler un type
séquence) est du ressort de la méthode __getitem__(). Si key n'est pas du bon
type, une TypeError peut être levée ; si la valeur est en dehors de l'ensemble des
indices de la séquence (après interprétation éventuelle des valeurs négatives),
une IndexError doit être levée. Pour les tableaux de correspondances,
si key n'existe pas dans le conteneur, une KeyError doit être levée.
Note
object.__delitem__(self, key)
object.__missing__(self, key)
object.__iter__(self)
Cette méthode est appelée quand un itérateur est requis pour un conteneur. Cette
méthode doit renvoyer un nouvel objet itérateur qui peut itérer sur tous les objets du
conteneur. Pour les tableaux de correspondances, elle doit itérer sur les clés du
conteneur.
Les objets itérateurs doivent aussi implémenter cette méthode ; ils doivent alors se
renvoyer eux-mêmes. Pour plus d'information sur les objets itérateurs, lisez Les
types itérateurs.
object.__reversed__(self)
object.__contains__(self, item)
object.__add__(self, other)
object.__sub__(self, other)
object.__mul__(self, other)
object.__matmul__(self, other)
object.__truediv__(self, other)
object.__floordiv__(self, other)
object.__mod__(self, other)
object.__divmod__(self, other)
object.__pow__(self, other[, modulo])
object.__lshift__(self, other)
object.__rshift__(self, other)
object.__and__(self, other)
object.__xor__(self, other)
object.__or__(self, other)
Ces méthodes sont appelées pour implémenter les opérations arithmétiques binaires
(+, -, *, @, /, //, %, divmod(), pow(), **, <<, >>, &, ^, |). Par exemple, pour
évaluer l'expression x + y, où x est une instance d'une classe qui possède une
méthode __add__(), x.__add__(y) est appelée. La méthode __divmod__() doit
être l'équivalent d'appeler __floordiv__() et __mod__() ; elle ne doit pas être
reliée à __truediv__(). Notez que __pow__() doit être définie de manière à
accepter un troisième argument optionnel si la version ternaire de la fonction
native pow() est autorisée.
Si l'une de ces méthodes n'autorise pas l'opération avec les arguments donnés, elle
doit renvoyer NotImplemented.
object.__radd__(self, other)
object.__rsub__(self, other)
object.__rmul__(self, other)
object.__rmatmul__(self, other)
object.__rtruediv__(self, other)
object.__rfloordiv__(self, other)
object.__rmod__(self, other)
object.__rdivmod__(self, other)
object.__rpow__(self, other[, modulo])
object.__rlshift__(self, other)
object.__rrshift__(self, other)
object.__rand__(self, other)
object.__rxor__(self, other)
object.__ror__(self, other)
Ces méthodes sont appelées pour implémenter les opérations arithmétiques binaires
(+, -, *, @, /, //, %, divmod(), pow(), **, <<, >>, &, ^, |) avec des opérandes
renversés (intervertis). Ces fonctions ne sont appelées que si l'opérande de gauche
n'autorise pas l'opération correspondante 3 et si les opérandes sont de types
différents 4. Par exemple, pour évaluer l'expression x - y, où y est une instance
d'une classe qui possède une méthode __rsub__(), y.__rsub__(x) est appelée
si x.__sub__(y) renvoie NotImplemented.
Note
object.__isub__(self, other)
object.__imul__(self, other)
object.__imatmul__(self, other)
object.__itruediv__(self, other)
object.__ifloordiv__(self, other)
object.__imod__(self, other)
object.__ipow__(self, other[, modulo])
object.__ilshift__(self, other)
object.__irshift__(self, other)
object.__iand__(self, other)
object.__ixor__(self, other)
object.__ior__(self, other)
object.__neg__(self)
object.__pos__(self)
object.__abs__(self)
object.__invert__(self)
object.__complex__(self)
object.__int__(self)
object.__float__(self)
object.__index__(self)
Note
object.__trunc__(self)
object.__floor__(self)
object.__ceil__(self)
Appelée pour implémenter la fonction native round() et les fonctions du
module math trunc(), floor() et ceil(). À moins que ndigits ne soit passé
à __round__(), toutes ces méthodes doivent renvoyer la valeur de l'objet tronquée
pour donner un Integral (typiquement un int).
Pour plus d'informations sur les gestionnaires de contexte, lisez Le type gestionnaire
de contexte.
object.__enter__(self)
object.__exit__(self, exc_type, exc_value, traceback)
Sort du contexte d'exécution relatif à cet objet. Les paramètres décrivent l'exception
qui a causé la sortie du contexte. Si l'on sort du contexte sans exception, les trois
arguments sont à None.
>>>
>>> class C:
... pass
...
>>> c = C()
>>> c.__len__ = lambda: 5
>>> len(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'C' has no len()
>>>
Essayer d'invoquer une méthode non liée d'une classe de cette manière est parfois
appelé « confusion de méta-classe » et se contourne en shuntant l'instance lors de la
recherche des méthodes spéciales :
>>>
>>> type(1).__hash__(1) == hash(1)
True
>>> type(int).__hash__(int) == hash(int)
True
>>>
3.4. Coroutines
3.4.1. Objets attendables (awaitables)
Un objet awaitable implémente généralement une méthode __await__(). Les
objets Coroutine renvoyés par les fonctions async def sont des awaitables.
Note
Doit renvoyer un itérateur. Doit être utilisé pour implémenter les objets awaitable. Par
exemple, asyncio.Future implémente cette méthode pour être compatible avec les
expressions await.
Voir aussi
Les coroutines disposent aussi des méthodes listées ci-dessous, analogues à celles
des générateurs (voir Méthodes des générateurs-itérateurs). Cependant, au contraire
des générateurs, vous ne pouvez pas itérer directement sur des coroutines.
Modifié dans la version 3.5.2: Utiliser await plus d'une fois sur une coroutine lève
une RuntimeError.
coroutine.send(value)
coroutine.throw(type[, value[, traceback]])
Lève l'exception spécifiée dans la coroutine. Cette méthode délègue à la
méthode throw() de l'itérateur qui a causé la suspension de la coroutine, s'il
possède une telle méthode. Sinon, l'exception est levée au point de suspension. Le
résultat (valeur de retour, StopIteration ou une autre exception) est le même que
lorsque vous itérez sur la valeur de retour de __await__(), décrite ci-dessus. Si
l'exception n'est pas gérée par la coroutine, elle est propagée à l'appelant.
coroutine.close()
3.4.3. Itérateurs asynchrones
Un itérateur asynchrone peut appeler du code asynchrone dans sa
méthode __anext__.
object.__aiter__(self)
object.__anext__(self)
class Reader:
async def readline(self):
...
def __aiter__(self):
return self
object.__aenter__(self)
object.__aexit__(self, exc_type, exc_value, traceback)
class AsyncContextManager:
async def __aenter__(self):
await log('entering context')
Notes
1
Il est possible, dans certains cas, de changer le type d'un objet, sous certaines
conditions. Cependant, ce n'est généralement pas une bonne idée car cela peut
conduire à un comportement très étrange si ce n'est pas géré correctement.
Les
méthodes __hash__(), __iter__(), __reversed__() et __contains__() ont
une gestion particulière pour cela ; les autres lèvent toujours TypeError, mais le
font en considérant que None n'est pas un appelable.
n'autorise pas signifie ici que la classe ne possède pas de méthode adéquate ou que
la méthode renvoie NotImplemented. N'assignez pas None à la méthode si vous
voulez un repli vers la méthode symétrique de l'opérande de droite — cela aurait
pour effet de bloquer un tel repli.
Pour des opérandes de même type, on considère que si la méthode originelle (telle
que __add__()) échoue, l'opération n'est pas autorisée et donc la méthode
symétrique n'est pas appelée.
4. Modèle d'exécution
4.1. Structure d'un programme
Un programme Python est construit à partir de blocs de code. Un block est un
morceau de texte de programme Python qui est exécuté en tant qu'unité. Les
éléments suivants sont des blocs : un module, un corps de fonction et une définition
de classe. Chaque commande écrite dans l'interpréteur interactif de Python est un
bloc. Un fichier de script (un fichier donné en entrée standard à l'interpréteur ou
spécifié en tant qu'argument de ligne de commande à l'interpréteur) est un bloc de
code. Une commande de script (une commande spécifiée sur la ligne de commande
de l'interpréteur avec l'option -c) est un bloc de code. La chaîne passée en argument
aux fonctions natives eval() et exec() est un bloc de code.
Un bloc de code est exécuté dans un cadre d'exécution. Un cadre contient des
informations administratives (utilisées pour le débogage) et détermine où et comment
l'exécution se poursuit après la fin de l'exécution du bloc de code.
4.2. Noms et liaisons
4.2.1. Liaisons des noms
Les noms sont des références aux objets. Ils sont créés lors des opérations de
liaisons de noms (name binding en anglais).
Les constructions suivantes conduisent à des opérations de liaison à des noms : les
paramètres formels d'une fonction, les instructions import, les définitions de fonctions
et de classes (le nom de la classe ou de la fonction est lié au bloc qui la définit) et les
cibles qui sont des identifiants dans les assignations, les entêtes de boucles for ou
après as dans une instruction with ou une clause except. L'instruction import sous la
forme from ... import * lie tous les noms définis dans le module importé, sauf ceux
qui commencent par un tiret bas ('_'). Cette forme ne doit être utilisée qu'au niveau
du module.
Une cible qui apparaît dans une instruction del est aussi considérée comme une
liaison à un nom dans ce cadre (bien que la sémantique véritable soit de délier le
nom).
Chaque assignation ou instruction import a lieu dans un bloc défini par une définition
de classe ou de fonction ou au niveau du module (le bloc de code de plus haut
niveau).
Si un nom est lié dans un bloc, c'est une variable locale de ce bloc, à moins qu'il ne
soit déclaré nonlocal ou global. Si un nom est lié au niveau du module, c'est une
variable globale (les variables du bloc de code de niveau module sont locales et
globales). Si une variable est utilisée dans un bloc de code alors qu'elle n'y est pas
définie, c'est une variable libre.
Quand un nom est utilisé dans un bloc de code, la résolution utilise la portée la plus
petite. L'ensemble de toutes les portées visibles dans un bloc de code
s'appelle l'environnement du bloc.
Quand un nom n'est trouvé nulle part, une exception NameError est levée. Si la portée
courante est celle d'une fonction et que le nom fait référence à une variable locale
qui n'a pas encore été liée au moment où le nom est utilisé, une
exception UnboundLocalError est levée. UnboundLocalError est une sous-classe
de NameError.
Si une opération de liaison intervient dans un bloc de code, toutes les utilisations du
nom dans le bloc sont considérées comme des références au bloc courant. Ceci peut
conduire à des erreurs quand un nom est utilisé à l'intérieur d'un bloc avant d'être lié.
La règle est subtile. Python n'attend pas de déclaration de variables et autorise les
opérations de liaison n'importe où dans un bloc de code. Les variables locales d'un
bloc de code peuvent être déterminées en parcourant tout le texte du bloc à la
recherche des opérations de liaisons.
class A:
a = 42
b = list(a + i for i in range(10))
L'espace de nommage natif associé à l'exécution d'un bloc de code est effectivement
trouvé en cherchant le nom __builtins__ dans l'espace de nommage globaux ; ce doit
être un dictionnaire ou un module (dans ce dernier cas, le dictionnaire du module est
utilisé). Par défaut, lorsque l'on se trouve dans le module __main__, __builtins__ est le
module natif builtins ; lorsque l'on se trouve dans tout autre module, __builtins__ est un
pseudonyme du dictionnaire du module builtins lui-même.
i = 10
def f():
print(i)
i = 42
f()
L'interpréteur Python lève une exception quand il détecte une erreur à l'exécution
(telle qu'une division par zéro). Un programme Python peut aussi lever explicitement
une exception avec l'instruction raise. Les gestionnaires d'exception sont spécifiés
avec l'instruction try … except. La clause finally d'une telle instruction peut être utilisée
pour spécifier un code de nettoyage qui ne gère pas l'exception mais qui est exécuté
quoi qu'il arrive (exception ou pas).
Quand une exception n'est pas du tout gérée, l'interpréteur termine l'exécution du
programme ou retourne à la boucle interactive. Dans ces cas, il affiche une trace de
la pile d'appels, sauf si l'exception est SystemExit.
Note
Les messages d'exception ne font pas partie de l'API Python. Leur contenu peut
changer d'une version de Python à une autre sans avertissement et le code ne doit
pas reposer sur ceux-ci s'il doit fonctionner sur plusieurs versions de l'interpréteur.
Notes
1
En effet, le code qui est exécuté par ces opérations n'est pas connu au moment où le
module est compilé.
Quand un module est importé pour la première fois, Python recherche le module et,
s'il est trouvé, créé un objet module 1 en l'initialisant. Si le module n'est pas trouvé,
une ModuleNotFoundError est levée. Python implémente plusieurs stratégies pour
rechercher le module d'un nom donné quand le mécanisme d'import est invoqué.
Ces stratégies peuvent être modifiées et étendues par divers moyens décrits dans
les sections suivantes.
Modifié dans la version 3.3: Le système d'importation a été mis à jour pour
implémenter complètement la deuxième partie de la PEP 302. Il n'existe plus de
mécanisme implicite d'importation (le système d'importation complet est
exposé via sys.meta_path). En complément, la gestion du paquet des noms natifs
a été implémenté (voir la PEP 420).
5.1. importlib
Le module importlib fournit une API riche pour interagir avec le système d'import.
Par exemple, importlib.import_module() fournit une API (que nous vous
recommandons) plus simple que la fonction native __import__() pour mettre en
œuvre le mécanisme d'import. Reportez-vous à la documentation de la
bibliothèque importlib pour obtenir davantage de détails.
5.2. Les paquets
Python ne connait qu'un seul type d'objet module et tous les modules sont donc de
ce type, que le module soit implémenté en Python, en C ou quoi que ce soit d'autre.
Pour aider à l'organisation des modules et fournir une hiérarchie des noms, Python
développe le concept de paquets.
Vous pouvez vous représenter les paquets comme des répertoires dans le système
de fichiers et les modules comme des fichiers dans ces répertoires. Mais ne prenez
pas trop cette analogie au pied de la lettre car les paquets et les modules ne
proviennent pas obligatoirement du système de fichiers. Dans le cadre de cette
documentation, nous utilisons cette analogie bien pratique des répertoires et des
fichiers. Comme les répertoires du système de fichiers, les paquets sont organisés
de manière hiérarchique et les paquets peuvent eux-mêmes contenir des sous-
paquets ou des modules.
Il est important de garder à l'esprit que tous les paquets sont des modules mais que
tous les modules ne sont pas des paquets. Formulé autrement, les paquets sont
juste un certain type de modules. Spécifiquement, tout module qui contient un
attribut __path__ est réputé être un paquet.
Tous les modules ont un nom. Les noms des sous-paquets sont séparés du nom du
paquet parent par des points (.), à l'instar de la syntaxe standard d'accès aux
attributs en Python. Ainsi, vous pouvez avoir un module nommé sys et un paquet
nommé email, qui à son tour possède un sous-paquet nommé email.mime avec un
module dans ce sous-paquet nommé email.mime.text.
5.2.1. Paquets classiques
Python définit deux types de paquets, les paquets classiques et les paquets espaces
de nommage. Les paquets classiques sont les paquets traditionnels tels qu'ils
existaient dans Python 3.2 et antérieurs. Un paquet classique est typiquement
implémenté sous la forme d'un répertoire contenant un fichier __init__.py. Quand
un paquet classique est importé, ce fichier __init__.py est implicitement exécuté.
parent/
__init__.py
one/
__init__.py
two/
__init__.py
three/
__init__.py
Importer parent.one exécute
implicitement parent/__init__.py et parent/one/__init__.py. Les
importations postérieures de parent.two ou parent.three respectivement
exécutent parent/two/__init__.py ou parent/three/__init__.py respective
ment.
Les paquets-espaces de nommage n'utilisent pas une liste ordinaire pour leur
attribut __path__. Ils utilisent en lieu et place un type itérable personnalisé qui
effectue automatiquement une nouvelle recherche de portions de paquets à la
tentative suivante d'importation dans le paquet si le chemin de leur paquet parent
(ou sys.path pour les paquets de plus haut niveau) change.
Pour les paquets-espaces de nommage, il n'existe pas de
fichier parent/__init__.py. En fait, il peut y avoir plusieurs
répertoires parent trouvés pendant le processus d'importation, où chacun est
apporté par une portion différente. Ainsi, parent/one n'est pas forcément
physiquement à côté de parent/two. Dans ce cas, Python crée un paquet-espace
de nommage pour le paquet de plus haut niveau parent dès que lui ou l'un de ses
sous-paquet est importé.
5.3. Recherche
Pour commencer la recherche, Python a besoin du nom qualifié du module (ou du
paquet, mais ici cela ne fait pas de différence) que vous souhaitez importer. Le nom
peut être donné en argument à l'instruction import ou comme paramètre aux
fonctions importlib.import_module() ou __import__().
Le nom est utilisé dans plusieurs phases de la recherche et peut être un chemin
séparé par des points pour un sous-module, par exemple truc.machin.bidule.
Dans ce cas, Python essaie d'abord d'importer truc puis truc.machin et
enfin truc.machin.bidule. Si n'importe laquelle des importations intermédiaires
échoue, une ModuleNotFoundError est levée.
Attention cependant : s'il reste une référence à l'objet module et que vous invalidez
l'entrée dans le cache de sys.modules puis ré-importez le module, les deux objets
modules ne seront pas les mêmes. À l'inverse, importlib.reload() ré-utilise
le même objet module et ré-initialise simplement le contenu du module en ré-
exécutant le code du module.
5.3.2. Chercheurs et chargeurs
Si le module n'est pas trouvé dans sys.modules, alors Python utilise son protocole
d'importation pour chercher et charger le module. Ce protocole se compose de deux
objets conceptuels : les chercheurs et les chargeurs. Le travail du chercheur consiste
à trouver, à l'aide de différentes stratégies, le module dont le nom a été fourni. Les
objets qui implémentent ces deux interfaces sont connus sous le vocable
"importateurs" (ils renvoient une référence vers eux-mêmes quand ils trouvent un
module qui répond aux attentes).
Les chercheurs ne chargent pas les modules. S'il trouve le module demandé, un
chercheur renvoie un spécificateur de module, qui contient toutes les informations
nécessaires pour importer le module ; celui-ci sera alors utilisé par le mécanisme
d'importation pour charger le module.
Les sections suivantes décrivent plus en détail le protocole utilisé par les chercheurs
et les chargeurs, y compris la manière de les créer et les enregistrer pour étendre le
mécanisme d'importation.
Les points d'entrée sur le chemin des importations sont appelés pendant le
traitement de sys.path (ou package.__path__), au moment où le chemin qui leur
correspond est atteint. Les points d'entrée sur le chemin des importations sont
enregistrés en ajoutant de nouveaux appelables à sys.path_hooks, comme décrit
ci-dessous.
5.3.4. Méta-chemins
Quand le module demandé n'est pas trouvé dans sys.modules, Python recherche
alors dans sys.meta_path qui contient une liste d'objets chercheurs dans des
méta-chemins. Ces chercheurs sont interrogés dans l'ordre pour voir s'ils savent
prendre en charge le module passé en paramètre. Les chercheurs dans les méta-
chemins implémentent une méthode find_spec() qui prend trois arguments : un
nom, un chemin d'import et (optionnellement) un module cible. Un chercheur dans
les méta-chemins peut utiliser n'importe quelle stratégie pour déterminer s'il est apte
à prendre en charge le module.
Le méta-chemin peut être parcouru plusieurs fois pour une seule requête
d'importation. Par exemple, si nous supposons qu'aucun des modules concernés n'a
déjà été mis en cache, importer truc.machin.bidule effectue une première
importation au niveau le plus haut, en
appelant c_m_c.find_spec("truc", None, None) pour chaque chercheur dans
les méta-chemins (c_m_c). Après que truc a été importé, truc.machin est importé
en parcourant le méta-chemin une deuxième fois,
appelant c_m_c.find_spec("truc.machin", truc.__path__, None). Une
fois truc.machin importé, le parcours final
appelle c_m_c.find_spec("truc.machin.bidule", truc.machin.__path__,
None).
Quelques chercheurs dans les méta-chemins ne gèrent que les importations de plus
haut niveau. Ces importateurs renvoient toujours None si on leur passe un deuxième
argument autre que None.
5.4. Chargement
Quand un spécificateur de module est trouvé, le mécanisme d'importation l'utilise (et
le chargeur qu'il contient) pour charger le module. Voici à peu près ce qui se passe
au sein de l'importation pendant la phase de chargement :
module = None
if spec.loader is not None and hasattr(spec.loader,
'create_module'):
# It is assumed 'exec_module' will also be defined on the
loader.
module = spec.loader.create_module(spec)
if module is None:
module = ModuleType(spec.name)
# The import-related module attributes get set here:
_init_module_attrs(spec, module)
if spec.loader is None:
if spec.submodule_search_locations is not None:
# namespace package
sys.modules[spec.name] = module
else:
# unsupported
raise ImportError
elif not hasattr(spec.loader, 'exec_module'):
module = spec.loader.load_module(spec.name)
# Set __loader__ and __package__ if missing.
else:
sys.modules[spec.name] = module
try:
spec.loader.exec_module(module)
except BaseException:
try:
del sys.modules[spec.name]
except KeyError:
pass
raise
return sys.modules[spec.name]
5.4.1. Chargeurs
Les chargeurs de modules fournissent la fonction critique du chargement : l'exécution
du module. Le mécanisme d'importation appelle la
méthode importlib.abc.Loader.exec_module() avec un unique argument,
l'objet module à exécuter. Toute valeur renvoyée par exec_module() est ignorée.
Si le module est un module Python (par opposition aux modules natifs ou aux
extensions chargées dynamiquement), le chargeur doit exécuter le code du module
dans l'espace des noms globaux du module ( module.__dict__).
Si le chargeur ne peut pas exécuter le module, il doit lever une ImportError,
alors que toute autre exception levée durant exec_module() est propagée.
5.4.2. Sous-modules
Quand un sous-module est chargé, quel que soit le mécanisme (par exemple avec
les instructions import, import-from ou avec la fonction native __import__()),
une liaison est créée dans l'espace de nommage du module parent vers l'objet sous-
module. Par exemple, si le paquet spam possède un sous-module foo, après
l'importation de spam.foo, spam possède un attribut foo qui est lié au sous-module.
Supposons que nous ayons l'arborescence suivante :
spam/
__init__.py
foo.py
bar.py
>>>
Connaissant la façon habituelle dont Python effectue les liens, cela peut sembler
surprenant. Mais c'est en fait une fonctionnalité fondamentale du système
d'importation. Si vous avez quelque
part sys.modules['spam'] et sys.modules['spam.foo'] (comme dans c'est le
cas ci-dessus après l'importation), alors le dernier doit apparaître comme
l'attribut foo du premier.
5.4.3. Spécificateurs de modules
Le mécanisme d'importation utilise diverses informations de chaque module pendant
l'importation, spécialement avant le chargement. La plupart de ces informations sont
communes à tous les modules. Le but d'un spécificateur de module est d'encapsuler
ces informations relatives à l'importation au sein de chaque module.
__name__
L'attribut __name__ doit contenir le nom complètement qualifié du module. Ce nom
est utilisé pour identifier de manière non équivoque le module dans le mécanisme
d'importation.
__loader__
L'attribut __loader__ doit pointer vers l'objet chargeur que le mécanisme
d'importation a utilisé pour charger le module. L'utilisation principale concerne
l'introspection, mais il peut être utilisé pour d'autres fonctionnalités relatives au
chargement. Par exemple, obtenir des données par l'intermédiaire du chargeur.
__package__
L'attribut __package__ du module doit être défini. Sa valeur doit être une chaîne de
caractères, qui peut être la même que son attribut __name__. Quand le module est
un paquet, la valeur de __package__ doit être définie à la même valeur que
son __name__. Quand le module n'est pas un paquet, __package__ doit être la
chaîne vide pour les modules de niveau le plus haut, et le nom du paquet parent
pour les sous-modules. Voir la PEP 366 pour plus de détails.
Cet attribut est utilisé à la place de __name__ pour calculer les importations relatives
explicites des modules principaux, comme défini dans la PEP 366. Il devrait avoir la
même valeur que __spec__.parent.
__spec__
L'attribut __spec__ doit contenir un lien vers le spécificateur de module qui a été
utilisé lors de l'importation du module. Définir __spec__ correctement s'applique
aussi pour l'initialisation des modules au démarrage de l'interpréteur. La seule
exception concerne __main__ où la valeur de __spec__ est None dans certains
cas.
Quand __package__ n'est pas défini, __spec__.parent est utilisé par défaut.
__path__
Si le module est un paquet (classique ou espace de nommage),
l'attribut __path__ de l'objet module doit être défini. La valeur doit être un itérable
mais peut être vide si __path__ n'a pas de sens dans le contexte.
Si __path__ n'est pas vide, il doit produire des chaînes lorsque l'on itère dessus.
Vous trouvez plus de détails sur la sémantique de __path__ plus loin ci-dessous.
Les modules qui ne sont pas des paquets ne doivent pas avoir d'attribut __path__.
__file__
__cached__
__file__ est optionnel. S'il est défini, la valeur de cet attribut doit être une chaîne.
Le système d'importation peut décider de laisser __file__ indéfini si cela ne fait pas
sens de le définir (par exemple, lorsqu'on charge un module depuis une base de
données).
5.4.5. module.__path__
Par définition, si un module possède un attribut __path__, c'est un paquet.
__path__ doit être un itérable de chaînes de caractères, mais il peut être vide. Les
mêmes règles que pour sys.path s'appliquent au __path__ d'un paquet
et sys.path_hooks (dont la description est donnée plus bas) est consulté pendant
le parcours de __path__ du paquet.
Python gère également les fichiers caches "avec empreintes", qui stockent une
empreinte (hash en anglais) du contenu de la source plutôt que des métadonnées. Il
existe deux variations des fichiers .pyc avec empreintes : vérifiés et non-vérifiés.
Pour les fichiers .pyc avec empreinte vérifiés, Python valide le fichier cache en
calculant l'empreinte du fichier source et compare les empreintes. Si l'empreinte
stockée dans le fichier cache est invalide, Python la recalcule et écrit un nouveau
fichier cache avec empreinte. Pour les fichiers .pyc avec empreinte non vérifiés,
Python considère simplement que le fichier cache est valide s'il existe. La validation
(ou non) des fichiers .pyc avec empreinte peut être définie avec l'option --check-
hash-based-pycs.
Le chercheur dans path en tant que tel ne sait pas comment importer quoi que ce
soit. Il ne fait que parcourir chaque entrée de path et associe à chacune d'elle un
"chercheur d'entrée dans path" qui sait comment gérer le type particulier de chemin
considéré.
Les chemins ne sont pas limités au système de fichiers. Ils peuvent faire référence à
des URL, des requêtes dans des bases de données ou tout autre emplacement qui
peut être spécifié dans une chaîne de caractères.
Si une entrée n'est pas présente dans le cache, le chercheur dans path itère sur
chaque callable de sys.path_hooks. Chaque point d'entrée sur une entrée de
path de cette liste est appelé avec un unique argument, l'entrée dans laquelle
chercher. L'appelable peut soit renvoyer un chercheur d'entrée dans path apte à
prendre en charge l'entrée ou lever une ImportError. Une ImportError est
utilisée par le chercheur dans path pour signaler que le point d'entrée n'a pas trouvé
de chercheur d'entrée dans path pour cette entrée. L'exception est ignorée et
l'itération sur le chemin des importations se poursuit. Le point d'entrée doit attendre
qu'on lui passe soit une chaîne de caractères soit une chaîne d'octets ; l'encodage
des chaînes d'octets est à la main du point d'entrée (par exemple, ce peut être
l'encodage du système de fichiers, de l'UTF-8 ou autre chose) et, si le point d'entrée
n'arrive pas à décoder l'argument, il doit lever une ImportError.
To selectively prevent the import of some modules from a hook early on the meta
path (rather than disabling the standard import system entirely), it is sufficient to
raise ModuleNotFoundError directly from find_spec() instead of returning None.
The latter indicates that the meta path search should continue, while raising an
exception terminates it immediately.
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
import XXX.YYY.ZZZ
5.8.1. __main__.__spec__
En fonction de la manière dont __main__ est initialisé, __main__.__spec__ est
défini de manière conforme ou mis à None.
5.9. Idées d'amélioration
XXX Ce serait vraiment bien de disposer d'un diagramme.
XXX * (import_machinery.rst) Pourquoi pas une section dédiée aux attributs des
modules et paquets, développant ou remplaçant les entrées associées dans la page
de référence du modèle de données ?
XXX Ajouter des informations sur les pièges et bizarreries de __main__ (c-à-d des
extraits de la PEP 395).
5.10. Références
Le mécanisme d'importation a considérablement évolué depuis les débuts de
Python. La spécification des paquets originale est toujours disponible, bien que
quelques détails ont changé depuis l'écriture de ce document.
Notes
Voir types.ModuleType.
3
Dans du code historique, il est possible de trouver des instances
de imp.NullImporter dans sys.path_importer_cache. Il est recommandé de
modifier ce code afin d'utiliser None à la place. Lisez Portage de code Python pour
plus de détails.
6. Expressions
Ce chapitre explique la signification des éléments des expressions en Python.
6.1. Conversions arithmétiques
When a description of an arithmetic operator below uses the phrase "the numeric
arguments are converted to a common type", this means that the operator
implementation for built-in types works as follows:
Si l'un des deux arguments est du type nombre complexe, l'autre est converti
en nombre complexe ;
sinon, si l'un des arguments est un nombre à virgule flottante, l'autre est
converti en nombre à virgule flottante ;
sinon, les deux doivent être des entiers et aucune conversion n'est
nécessaire.
Des règles supplémentaires s'appliquent pour certains opérateurs (par exemple, une
chaîne comme opérande de gauche pour l'opérateur %). Les extensions doivent
définir leurs propres règles de conversion.
6.2. Atomes
Les atomes sont les éléments de base des expressions. Les atomes les plus simples
sont les identifiants et les littéraux. Les expressions entre parenthèses, crochets ou
accolades sont aussi classées syntaxiquement comme des atomes. La syntaxe pour
les atomes est :
6.2.1. Identifiants (noms)
Un identifiant qui apparaît en tant qu'atome est un nom. Lisez la section Identifiants
et mots-clés pour la définition lexicale et la section Noms et liaisons pour la
documentation sur les noms et les liaisons afférentes.
Quand un nom est lié à un objet, l'évaluation de l'atome produit cet objet. Quand le
nom n'est pas lié, toute tentative de l'évaluer lève une exception NameError.
6.2.2. Littéraux
Python gère les littéraux de chaînes de caractères, de chaînes d'octets et de
plusieurs autres types numériques :
L'évaluation d'un littéral produit un objet du type donné (chaîne de caractères, chaîne
d'octets, entier, nombre à virgule flottante, nombre complexe) avec la valeur donnée.
La valeur peut être approximée dans le cas des nombres à virgule flottante et des
nombres imaginaires (complexes). Reportez-vous à la section Littéraux pour les
détails.
Tous les littéraux sont de types immuables et donc l'identifiant de l'objet est moins
important que sa valeur. Des évaluations multiples de littéraux avec la même valeur
(soit la même occurrence dans le texte du programme, soit une autre occurrence)
résultent dans le même objet ou un objet différent avec la même valeur.
6.2.3. Formes parenthésées
Une forme parenthésée est une liste d'expressions (cette liste est en fait optionnelle)
placée à l'intérieur de parenthèses :
Une liste d'expressions entre parenthèses produit ce que la liste de ces expressions
produirait : si la liste contient au moins une virgule, elle produit un n-uplet
(type tuple) ; sinon, elle produit l'expression elle-même (qui constitue donc elle-même
la liste d'expressions).
Une paire de parenthèses vide produit un objet n-uplet vide. Comme les n-uplets
sont immuables, la même règle que pour les littéraux s'applique (c'est-à-dire que
deux occurrences du n-uplet vide peuvent, ou pas, produire le même objet).
Notez que les tuples ne sont pas créés par les parenthèses mais par l'utilisation de la
virgule. L'exception est le tuple vide, pour lequel les parenthèses sont
requises (autoriser que « rien » ne soit pas parenthésé dans les expressions aurait
généré des ambigüités et aurait permis à certaines coquilles de passer inaperçu).
Une compréhension est constituée par une seule expression suivie par au moins une
clause for et zéro ou plus clauses for ou if. Dans ce cas, les éléments du
nouveau conteneur sont ceux qui auraient été produits si l'on avait considéré toutes
les clauses for ou if comme des blocs, imbriqués de la gauche vers la droite, et
évalué l'expression pour produire un élément à chaque fois que le bloc le plus
imbriqué était atteint.
6.2.5. Agencements de listes
Un agencement de liste est une suite (possiblement vide) d'expressions à l'intérieur
de crochets :
Un agencement de liste produit un nouvel objet liste, dont le contenu est spécifié soit
par une liste d'expression soit par une compréhension. Quand une liste
d'expressions (dont les éléments sont séparés par des virgules) est fournie, ces
éléments sont évalués de la gauche vers la droite et placés dans l'objet liste, dans
cet ordre. Quand c'est une compréhension qui est fournie, la liste est construite à
partir des éléments produits par la compréhension.
6.2.6. Agencements d'ensembles
Un agencement d'ensemble (type set) est délimité par des accolades et se distingue
de l'agencement d'un dictionnaire par le fait qu'il n'y a pas de « deux points » : pour
séparer les clés et les valeurs :
Un ensemble vide ne peut pas être construit par {} ; cette écriture construit un
dictionnaire vide.
6.2.7. Agencements de dictionnaires
Un agencement de dictionnaire est une série (possiblement vide) de couples clés-
valeurs entourée par des accolades :
dict_display ::= "{" [key_datum_list | dict_comprehension]
"}"
key_datum_list ::= key_datum ("," key_datum)* [","]
key_datum ::= expression ":" expression | "**" or_expr
dict_comprehension ::= expression ":" expression comp_for
Si une séquence (dont les éléments sont séparés par des virgules) de couples clés-
valeurs est fournie, les couples sont évalués de la gauche vers la droite pour définir
les entrées du dictionnaire : chaque objet clé est utilisé comme clé dans le
dictionnaire pour stocker la donnée correspondante. Cela signifie que vous pouvez
spécifier la même clé plusieurs fois dans la liste des couples clés-valeurs et, dans ce
cas, la valeur finalement stockée dans le dictionnaire est la dernière donnée.
Les restrictions relatives aux types des clés sont données dans la section Hiérarchie
des types standards (pour résumer, le type de la clé doit être hachable, ce qui exclut
tous les objets muables). Les collisions entre les clés dupliquées ne sont pas
détectées ; la dernière valeur (celle qui apparaît le plus à droite dans l'agencement)
stockée prévaut pour une clé donnée.
6.2.8. Expressions génératrices
Une expression génératrice est une notation concise pour un générateur, entourée
de parenthèses :
Les parenthèses peuvent être omises pour les appels qui ne possèdent qu'un seul
argument. Voir la section Appels pour les détails.
En raison des effets de bords sur la portée contenant, les expressions yield ne sont
pas autorisées dans la portée implicite utilisée dans l'implémentation des
compréhensions et des expressions générateurs (dans Python 3.7, de telles
expressions lèvent un DeprecationWarning à la compilation ; à partir de Python
3.8, elles lèveront une SyntaxError).
Les fonctions génératrices sont décrites plus loin alors que les fonctions générateurs
asynchrones sont décrites séparément dans la section Fonctions génératrices
asynchrones.
Lorsqu'une fonction génératrice est appelée, elle renvoie un itérateur que l'on appelle
générateur. Ce générateur contrôle l'exécution de la fonction génératrice. L'exécution
commence lorsque l'une des méthodes du générateur est appelée. À ce moment,
l'exécution se déroule jusqu'à la première expression yield, où elle se suspend,
renvoyant la valeur de expression_list à l'appelant du générateur. Cette
suspension conserve tous les états locaux, y compris les liaisons en cours des
variables locales, le pointeur d'instruction, la pile d'évaluation interne et l'état de tous
les gestionnaires d'exceptions. Lorsque l'exécution reprend en appelant l'une des
méthodes du générateur, la fonction s'exécute exactement comme si
l'expression yield n'avait été qu'un simple appel externe. La valeur de
l'expression yield après reprise dépend de la méthode qui a permis la reprise de
l'exécution. Si c'est __next__() qui a été utilisée (typiquement via un for ou la
fonction native next()) alors le résultat est None. Sinon, si c'est send() qui a été
utilisée, alors le résultat est la valeur transmise à cette méthode.
Tout ceci rend les fonctions génératrices très similaires aux coroutines : elles
produisent plusieurs objets via des expressions yield, elles possèdent plus qu'un
seul point d'entrée et leur exécution peut être suspendue. La seule différence est
qu'une fonction génératrice ne peut pas contrôler où l'exécution doit se poursuivre
après une instruction yield ; ce contrôle est toujours du ressort de l'appelant au
générateur.
Voir aussi
PEP 255 : Générateurs simples
Notez que l'appel à une méthode ci-dessous d'un générateur alors que le générateur
est déjà en cours d'exécution lève une exception ValueError.
generator.__next__()
Cette méthode est normalement appelée implicitement, par exemple par une
boucle for ou par la fonction native next().
generator.send(value)
generator.throw(type[, value[, traceback]])
generator.close()
6.2.9.2. Exemples
>>>
Quand une fonction génératrice asynchrone est appelée, elle renvoie un itérateur
asynchrone, autrement appelé objet générateur asynchrone. Cet objet contrôle
l'exécution de la fonction génératrice. Un objet générateur asynchrone est
typiquement utilisé dans une instruction async for à l'intérieur d'une fonction
coroutine de la même manière qu'un objet générateur serait utilisé dans une
instruction for.
coroutine agen.__anext__()
coroutine agen.asend(value)
coroutine agen.aclose()
6.3. Primaires
Les primaires (primary dans la grammaire formelle ci-dessous) représentent les
opérations qui se lient au plus proche dans le langage. Leur syntaxe est :
La primaire doit s'évaluer à un objet d'un type qui gère les références aux attributs,
ce qui est le cas de la plupart des objets. Cet objet doit alors produire l'attribut dont le
nom est « identifier ». Cette production peut être personnalisée en surchargeant la
méthode __getattr__(). Si l'attribut n'est pas disponible, une
exception AttributeError est levée. Sinon, le type et la valeur de l'objet produit
sont déterminés par l'objet. Plusieurs évaluations successives d'une référence à un
même attribut peuvent produire différents objets.
6.3.2. Sélections
Une sélection (subscription dans la grammaire formelle ci-dessous) désigne un
élément dans un objet séquence (chaîne, n-uplet ou liste) ou tableau de
correspondances (dictionnaire) :
La primaire doit s'appliquer à un objet qui gère les sélections (une liste ou un
dictionnaire par exemple). Les objets définis par l'utilisateur peuvent gérer les
sélections en définissant une méthode __getitem__().
La syntaxe formelle ne traite pas des cas d'indices négatifs dans les séquences ;
cependant, toutes les séquences natives possèdent une
méthode __getitem__() qui interprète les indices négatifs en ajoutant la longueur
de la séquence à l'indice (de manière à ce que x[-1] sélectionne le dernier élément
de x). La valeur résultante doit être un entier positif ou nul, inférieur au nombre
d'éléments dans la séquence ; la sélection désigne alors l'élément dont l'indice est
cette valeur (en comptant à partir de zéro). Comme la gestion des indices négatifs et
des tranches est faite par la méthode __getitem__(), les sous-classes qui
surchargent cette méthode doivent aussi savoir les gérer, de manière explicite.
Les éléments des chaînes sont des caractères. Un caractère n'est pas un type en
tant que tel, c'est une chaîne de longueur un.
6.3.3. Tranches
Une tranche (slicing dans la grammaire formelle ci-dessous) sélectionne un intervalle
d'éléments d'un objet séquence (par exemple une chaîne, un n-uplet ou une liste,
respectivement les types string, tuple et list). Les tranches peuvent être utilisées
comme des expressions ou des cibles dans les assignations ou les instructions del.
La syntaxe est la suivante :
Il existe une ambigüité dans la syntaxe formelle ci-dessus : tout ce qui ressemble à
une liste d'expressions (expression_list vue avant) ressemble aussi à une liste de
tranches (slice_list dans la grammaire ci-dessus). En conséquence, toute sélection
(subscription dans la grammaire) peut être interprétée comme une tranche. Plutôt
que de compliquer encore la syntaxe, l'ambigüité est levée en disant que, dans ce
cas, l'interprétation en tant que sélection (subscription) est prioritaire sur
l'interprétation en tant que tranche (c'est le cas si la liste de tranches ( slice_list) ne
contient aucune tranche en tant que telle).
La sémantique pour une tranche est définie comme suit. La primaire est indicée (en
utilisant la même méthode __getitem__() que pour les sélections normales) avec
une clé qui est construite à partir de la liste de tranches (slice_list dans la
grammaire), de cette manière : si la liste de tranches contient au moins une virgule
(,), la clé est un n-uplet contenant la conversion des éléments de la tranche ; sinon,
la conversion du seul élément de la tranche est la clé. La conversion d'un élément de
tranche qui est une expression est cette expression. La conversion d'une tranche en
tant que telle est un objet slice (voir la section Hiérarchie des types standards) dont
les attributs start, stop et step sont les valeurs des expressions données pour la
borne inférieure (lower_bound dans la grammaire), la borne supérieure
(upper_bound dans la grammaire) et le pas (stride dans la grammaire),
respectivement. En cas d'expression manquante, la valeur par défaut est None.
6.3.4. Appels
Un appel (call dans la grammaire ci-dessous) appelle un objet appelable (par
exemple, une fonction) avec, possiblement, une liste d'arguments :
call ::= primary "(" [argument_list [","] |
comprehension] ")"
argument_list ::= positional_arguments [","
starred_and_keywords]
["," keywords_arguments]
| starred_and_keywords [","
keywords_arguments]
| keywords_arguments
positional_arguments ::= ["*"] expression ("," ["*"] expression)*
starred_and_keywords ::= ("*" expression | keyword_item)
("," "*" expression | "," keyword_item)*
keywords_arguments ::= (keyword_item | "**" expression)
("," keyword_item | "," "**"
expression)*
keyword_item ::= identifier "=" expression
Une virgule finale (optionnelle) peut être présente, après les arguments positionnels
et par mots-clés, mais elle n'affecte pas la sémantique.
La primaire doit s'évaluer à un objet appelable (une fonction définie par l'utilisateur,
une fonction native, une méthode d'objet natif, un objet de classe, une méthode
d'instance de classe ou tout objet possédant une méthode __call__() est un
appelable). Toutes les expressions des arguments sont évaluées avant que l'appel
ne soit exécuté. Référez-vous à la section Définition de fonctions pour la syntaxe des
listes de paramètres formels.
Si des arguments par mots-clés sont présents, ils sont d'abord convertis en
arguments positionnels, comme suit. Pour commencer, une liste de slots vides est
créée pour les paramètres formels. S'il y a N arguments positionnels, ils sont placés
dans les N premiers slots. Ensuite, pour chaque argument par mot-clé, l'identifiant
est utilisé pour déterminer le slot correspondant (si l'identifiant est le même que le
nom du premier paramètre formel, le premier slot est utilisé, et ainsi de suite). Si
le slot est déjà rempli, une exception TypeError est levée. Sinon, la valeur de
l'argument est placée dans le slot, ce qui le remplit (même si l'expression est None,
cela remplit le slot). Quand tous les arguments ont été traités, les slots qui sont
toujours vides sont remplis avec la valeur par défaut correspondante dans la
définition de la fonction (les valeurs par défaut sont calculées, une seule fois, lorsque
la fonction est définie ; ainsi, un objet mutable tel qu'une liste ou un dictionnaire
utilisé en tant valeur par défaut sera partagé entre tous les appels qui ne spécifient
pas de valeur d argument pour ce slot ; on évite généralement de faire ça). S'il reste
des slots pour lesquels aucune valeur par défaut n'est définie, une
exception TypeError est levée. Sinon, la liste des slots remplie est utilisée en tant
que liste des arguments pour l'appel.
CPython implementation detail: Une implémentation peut fournir des fonctions
natives dont les paramètres positionnels n'ont pas de nom, même s'ils sont
« nommés » pour les besoins de la documentation. Ils ne peuvent donc pas être
spécifiés par mot-clé. En CPython, les fonctions implémentées en C qui
utilisent PyArg_ParseTuple() pour analyser leurs arguments en font partie.
>>>
Modifié dans la version 3.5: Les appels de fonction acceptent n'importe quel nombre
de dépaquetages par * ou **. Des arguments positionnels peuvent suivre les
dépaquetages d'itérables (*) et les arguments par mots-clés peuvent suivre les
dépaquetages de dictionnaires (**). Proposé pour la première fois par la PEP 448.
Un appel renvoie toujours une valeur, possiblement None, à moins qu'il ne lève une
exception. La façon dont celle valeur est calculée dépend du type de l'objet
appelable.
Si c'est ---
un objet classe :
la classe doit définir une méthode __call__() ; l'effet est le même que si cette
méthode était appelée.
6.4. Expression await
Suspend l'exécution de la coroutine sur un objet awaitable. Ne peut être utilisée qu'à
l'intérieur d'une coroutine function.
6.5. L'opérateur puissance
L'opérateur puissance est plus prioritaire que les opérateurs unaires sur sa gauche ;
il est moins prioritaire que les opérateurs unaires sur sa droite. La syntaxe est :
Ainsi, dans une séquence sans parenthèse de puissance et d'opérateurs unaires, les
opérateurs sont évalués de droite à gauche (ceci ne contraint pas l'ordre d'évaluation
des opérandes) : -1**2 donne -1.
Pour les opérandes entiers, le résultat est du même type à moins que le deuxième
argument ne soit négatif ; dans ce cas, tous les arguments sont convertis en
nombres à virgule flottante et le résultat est un nombre à virgule flottante. Par
exemple, 10**2 renvoie 100 mais 10**-2 renvoie 0.01.
Dans ces trois cas, si l'argument n'est pas du bon type, une
exception TypeError est levée.
En plus de calculer le modulo sur les nombres, l'opérateur % est aussi surchargé par
les objets chaînes de caractères pour effectuer le formatage de chaîne « à
l'ancienne ». La syntaxe pour le formatage de chaînes est décrit dans la référence de
la bibliothèque Python, dans la section Formatage de chaines à la printf.
6.8. Opérations de décalage
Les opérations de décalage sont moins prioritaires que les opérations arithmétiques :
6.10. Comparaisons
Au contraire du C, toutes les opérations de comparaison en Python possèdent la
même priorité, qui est plus faible que celle des opérations arithmétiques, décalages
ou binaires bit à bit. Toujours contrairement au C, les expressions telles
que a < b < c sont interprétées comme elles le seraient conventionnellement en
mathématiques :
6.10.1. Comparaisons de valeurs
Les opérateurs <, >, ==, >=, <= et != comparent les valeurs de deux objets. Les
objets n'ont pas besoin d'être du même type.
Le chapitre Objets, valeurs et types indique que les objets ont une valeur (en plus
d'un type et d'un identifiant). La valeur d'un objet est une notion plutôt abstraite en
Python : par exemple, il n'existe pas de méthode canonique pour accéder à la valeur
d'un objet. De la même manière, il n'y a aucune obligation concernant la construction
de la valeur d'un objet, par exemple qu'elle prenne en compte toutes les données de
ses attributs. Les opérateurs de comparaison implémentent une notion particulière
de ce qu'est la valeur d'un objet. Vous pouvez vous le représenter comme une
définition indirecte de la valeur d'un objet, via l'implémentation de leur comparaison.
Le comportement par défaut pour le test d'égalité ( == et !=) se base sur les
identifiants des objets. Ainsi, un test d'égalité entre deux instances qui ont le même
identifiant est vrai, un test d'égalité entre deux instances qui ont des identifiants
différents est faux. La raison de ce choix est que Python souhaite que tous les objets
soient réflexifs, c'est-à-dire que x is y implique x == y.
La relation d'ordre (<, >, <= et >=) n'est pas fournie par défaut ; une tentative se
solde par une TypeError. La raison de ce choix est qu'il n'existe pas d'invariant
similaire à celui de l'égalité.
Le comportement du test d'égalité par défaut, à savoir que les instances avec des
identités différentes ne sont jamais égales, peut être en contradiction avec les types
qui définissent la « valeur » d'un objet et se basent sur cette « valeur » pour l'égalité.
De tels types doivent personnaliser leurs tests de comparaison et, en fait, c'est ce
qu'ont fait un certain nombre de types natifs.
La liste suivante décrit le comportement des tests d'égalité pour les types natifs les
plus importants.
Les chaînes de caractères et les séquences binaires ne peuvent pas être comparées
directement.
Les séquences (instances de tuple, list ou range) peuvent être
comparées uniquement entre instances de même type, en sachant que les
intervalles (range) ne gèrent pas la relation d'ordre. Le test d'égalité entre ces types
renvoie faux et une comparaison entre instances de types différents lève
une TypeError.
>>>
o Deux collections sont égales si elles sont du même type, ont la même
longueur et si les éléments correspondants de chaque paire sont égaux. Par
exemple, [1,2] == (1,2) est faux car les types sont différents.
o Les collections qui gèrent la relation d'ordre sont ordonnées comme
leur premier élément différent (par exemple, [1,2,x] <= [1,2,y] a la même
valeur que x <= y). Si un élément n'a pas de correspondant, la collection la plus
courte est la plus petite (par exemple, [1,2] < [1,2,3] est vrai).
Les tableaux de correspondances (instances de dict) sont égales si et
seulement si toutes leurs paires (clé, valeur) sont égales. L'égalité des clés et des
valeurs met en œuvre la réflexivité.
Les opérateurs d'inclusion et de sur-ensemble sont définis. Ces relations ne sont pas
des relations d'ordre total (par exemple, les deux ensembles {1,2} et {2,3} ne sont
pas égaux, l'un n'est pas inclus dans l'autre, l'un n'est pas un sur-ensemble de
l'autre). Ainsi, les ensembles ne sont pas des arguments appropriés pour les
fonctions qui dépendent d'un ordre total (par exemple, les
fonctions min(), max() et sorted() produisent des résultats indéfinis si on leur
donne des listes d'ensembles en entrée).
Le test d'égalité doit être réflexif. En d'autres termes, des objets identiques
doivent être égaux :
x is y implique x == y
x == y et y == x
x != y et y != x
x < y et y > x
x <= y et y >= x
x > y and y > z implique x > z
x < y and y <= z implique x < z
x == y et not x != y
6.10.3. Comparaisons d'identifiants
Les opérateurs is et is not testent l'égalité des identifiants des objets : x is y est
vrai si et seulement si x et y sont le même objet. L'identifiant d'un objet est déterminé
en utilisant la fonction id(). x is not y renvoie le résultat contraire de l'égalité des
identifiants 4.
6.11. Opérations booléennes
or_test ::= and_test | or_test "or" and_test
and_test ::= not_test | and_test "and" not_test
not_test ::= comparison | "not" not_test
Dans le contexte des opérations booléennes et quand des expressions sont utilisées
par des instructions de contrôle du flux d'exécution, les valeurs suivantes sont
considérées comme fausses : False, None, zéro quel que soit le type, la chaîne vide
et tout conteneur vide (y compris les chaînes, n-uplets, listes, dictionnaires,
ensembles, ensembles gelés). Toutes les autres valeurs sont considérées comme
vraies. Les objets allogènes peuvent personnaliser leur table de vérité en
implémentant une méthode __bool__().
6.12. Expressions conditionnelles
conditional_expression ::= or_test ["if" or_test "else"
expression]
expression ::= conditional_expression | lambda_expr
expression_nocond ::= or_test | lambda_expr_nocond
Les expressions lambda sont utilisées pour créer des fonctions anonymes.
L'expression lambda parameters: expression produit un objet fonction. Cet
objet anonyme se comporte comme un objet fonction défini par :
def <lambda>(parameters):
return expression
6.14. Listes d'expressions
expression_list ::= expression ("," expression)* [","]
starred_list ::= starred_item ("," starred_item)* [","]
starred_expression ::= expression | (starred_item ",")*
[starred_item]
starred_item ::= expression | "*" or_expr
Sauf lorsqu'elle fait partie d'un agencement de liste ou d'ensemble, une liste
d'expressions qui contient au moins une virgule produit un n-uplet (tuple). La
longueur du n-uplet est le nombre d'expressions dans la liste. Les expressions sont
évaluées de la gauche vers la droite.
Dans les lignes qui suivent, les expressions sont évaluées suivant l'ordre
arithmétique de leurs suffixes :
Notez que les comparaisons, les tests d'appartenance et les tests d'identifiants
possèdent tous la même priorité et s'enchaînent de la gauche vers la droite comme
décrit dans la section Comparaisons.
Opérateur Description
lambda Expression lambda
if – else Expressions conditionnelle
or OR (booléen)
and AND (booléen)
not x NOT (booléen)
in, not in, is, is not, <, Comparaisons, y compris les tests d'appartenance et les
<=, >, >=, !=, == tests d'identifiants
| OR (bit à bit)
^ XOR (bit à bit)
& AND (bit à bit)
Opérateur Description
<<, >> décalages
+, - Addition et soustraction
x[indice], x[indice:ind
ice], x(arguments...), x indiçage, tranches, appel, référence à un attribut
.attribut
(expressions...),
Notes
2 Si x est très proche d'un multiple entier de y, il est possible que x/y soit supérieur de un
par rapport à (x-x%y)//y en raison des arrondis. Dans de tels cas, Python renvoie le
second résultat afin d'avoir divmod(x,y)[0] * y + x % y le plus proche de x.
Pour comparer des chaînes au niveau des caractères abstraits (afin d'avoir quelque
chose d'intuitif pour les humains), utilisez unicodedata.normalize().
Ce genre d'instruction évalue la liste d'expressions (qui peut se limiter à une seule
expression).
7.2. Les assignations
Les assignations sont utilisées pour lier ou relier des noms à des valeurs et modifier
des attributs ou des éléments d'objets muables :
Une assignation évalue la liste d'expressions (gardez en mémoire que ce peut être
une simple expression ou une liste dont les éléments sont séparés par des virgules,
cette dernière produisant un n-uplet) et assigne l'unique objet résultant à chaque liste
cible, de la gauche vers la droite.
L'assignation d'un objet à une liste cible, optionnellement entourée par des
parenthèses ou des crochets, est définie récursivement comme suit.
Si la liste cible est une cible unique sans virgule de fin, optionnellement entre
parenthèses, l'objet est assigné à cette cible.
Sinon : l'objet doit être un itérable avec le même nombre d'éléments qu'il y a
de cibles dans la liste cible ; les éléments sont assignés, de la gauche vers la droite,
vers les cibles correspondantes.
L'assignation d'un objet vers une cible unique est définie récursivement comme suit.
Note : si l'objet est une instance de classe et que la référence à l'attribut apparaît des
deux côtés de l'opérateur d'assignation, l'expression "à droite", a.x peut accéder soit
à l'attribut d'instance ou (si cet attribut d'instance n'existe pas) à l'attribut de classe.
L'expression cible "à gauche" a.x est toujours définie comme un attribut d'instance,
en le créant si nécessaire. Ainsi, les deux occurrences de a.x ne font pas
nécessairement référence au même attribut : si l'expression "à droite" fait référence à
un attribut de classe, l'expression "à gauche" crée un nouvel attribut d'instance
comme cible de l'assignation :
class Cls:
x = 3 # class variable
inst = Cls()
inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3
Si la primaire est un objet séquence mutable (telle qu'une liste), la sélection doit
produire un entier. S'il est négatif, la longueur de la séquence lui est ajoutée. La
valeur résultante doit être un entier positif ou nul, plus petit que la longueur de la
séquence, et Python demande à la séquence d'assigner l'objet à l'élément se
trouvant à cet indice. Si l'indice est hors limites, une IndexError est levée (une
assignation à une sélection dans une séquence ne peut pas ajouter de nouveaux
éléments à une liste).
Bien que la définition de l'assignation implique que le passage entre le côté gauche
et le côté droit soient « simultanés » (par exemple, a, b = b, a permute les deux
variables), le passage à l'intérieur des collections de variables que l'on assigne
intervient de la gauche vers la droite, ce qui peut entraîner quelques confusions. Par
exemple, le programme suivant affiche [0, 2] :
x = [0, 1]
i = 0
i, x[i] = 1, 2 # i is updated, then x[i] is updated
print(x)
Voir aussi
PEP 3132 -- dépaquetage étendu d'itérable
Spécification de la fonctionnalité *cible.
7.2.1. Les assignations augmentées
Une assignation augmentée est la combinaison, dans une seule instruction, d'une
opération binaire et d'une assignation :
augmented_assignment_stmt ::= augtarget augop (expression_list |
yield_expression)
augtarget ::= identifier | attributeref |
subscription | slicing
augop ::= "+=" | "-=" | "*=" | "@=" | "/=" |
"//=" | "%=" | "**="
| ">>=" | "<<=" | "&=" | "^=" | "|
="
Pour les cibles qui sont des références à des attributs, la même mise en garde sur
les attributs de classe et d'instances s'applique que pour les assignations normales.
Pour des noms simples en tant que cibles d'assignation, dans une portée de classe
ou de module, les annotations sont évaluées et stockées dans un attribut de classe
ou de module spécial, __annotations__, qui est un dictionnaire dont les clés sont
les noms de variables (réécrits si le nom est privé) et les valeurs sont les
annotations. Cet attribut est accessible en écriture et est automatiquement créé au
démarrage de l'exécution du corps de la classe ou du module, si les annotations sont
trouvées statiquement.
Pour les expressions en tant que cibles d'assignations, les annotations sont évaluées
dans la portée de la classe ou du module, mais ne sont pas stockées.
Si le nom est annoté dans la portée d'une fonction, alors ce nom est local à cette
portée. Les annotations ne sont jamais évaluées et stockées dans les portées des
fonctions.
Si la partie droite est présente, une assignation annotée effectue l'assignation en tant
que telle avant d'évaluer les annotations (là où c'est possible). Si la partie droite n'est
pas présente pour une cible d'expression, alors l'interpréteur évalue la cible sauf pour
le dernier appel à __setitem__() ou __setattr__().
Voir aussi
PEP 526 -- Syntaxe pour les annotations de variables
La proposition qui a ajouté la syntaxe pour annoter les types de variables (y compris
les variables de classe et les variables d'instance), au lieu de les exprimer par le
biais de commentaires.
PEP 484 -- Indices de type
7.3. L'instruction assert
Les instructions assert sont une manière pratique d'insérer des tests de débogage
au sein d'un programme :
if __debug__:
if not expression1: raise AssertionError(expression2)
7.4. L'instruction pass
pass_stmt ::= "pass"
pass est une opération vide --- quand elle est exécutée, rien ne se passe. Elle est
utile comme bouche-trou lorsqu'une instruction est syntaxiquement requise mais
qu'aucun code ne doit être exécuté. Par exemple :
7.5. L'instruction del
del_stmt ::= "del" target_list
7.6. L'instruction return
return_stmt ::= "return" [expression_list]
return ne peut être placée qu'à l'intérieur d'une définition de fonction, pas à
l'intérieur d'une définition de classe.
7.7. L'instruction yield
yield_stmt ::= yield_expression
L'instruction yield est sémantiquement équivalente à une expression yield.
L'instruction yield peut être utilisée pour omettre les parenthèses qui seraient
autrement requises dans l'instruction équivalente d'expression yield. Par exemple,
les instructions yield
yield <expr>
yield from <expr>
(yield <expr>)
(yield from <expr>)
7.8. L'instruction raise
raise_stmt ::= "raise" [expression ["from" expression]]
>>>
>>> try:
... print(1 / 0)
... except Exception as exc:
... raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
Un mécanisme similaire est mis en œuvre implicitement si une exception est levée à
l'intérieur d'un gestionnaire d'exception ou d'une clause finally : la première
exception est rattachée à l'attribut __context__ de la nouvelle exception :
>>>
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
>>>
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError("Something bad happened") from None
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
7.9. L'instruction break
break_stmt ::= "break"
Si une boucle for est terminée par un break, la cible qui contrôle la boucle garde sa
valeur.
7.10. L'instruction continue
continue_stmt ::= "continue"
7.11. L'instruction import
import_stmt ::= "import" module ["as" identifier] ("," module
["as" identifier])*
| "from" relative_module "import" identifier
["as" identifier]
("," identifier ["as" identifier])*
| "from" relative_module "import" "("
identifier ["as" identifier]
("," identifier ["as" identifier])* [","] ")"
| "from" module "import" "*"
module ::= (identifier ".")* identifier
relative_module ::= "."* module | "."+
Quand l'instruction contient plusieurs clauses (séparées par des virgules), les deux
étapes sont menées séparément pour chaque clause, comme si les clauses étaient
séparées dans des instructions d'importations individuelles.
Exemples :
Si la liste des noms est remplacée par une étoile ( '*'), tous les noms publics définis
dans le module sont liés dans l'espace des noms locaux de la portée où apparaît
l'instruction import.
Quand vous spécifiez les modules à importer, vous n'avez pas besoin de spécifier
les noms absolus des modules. Quand un module ou un paquet est contenu dans un
autre paquet, il est possible d'effectuer une importation relative à l'intérieur du même
paquet de plus haut niveau sans avoir à mentionner le nom du paquet. En utilisant
des points en entête du module ou du paquet spécifié après from, vous pouvez
spécifier combien de niveaux vous souhaitez remonter dans la hiérarchie du paquet
courant sans spécifier de nom exact. Un seul point en tête signifie le paquet courant
où se situe le module qui effectue l'importation. Deux points signifient de remonter
d'un niveau. Trois points, remonter de deux niveaux et ainsi de suite. Ainsi, si vous
exécutez from . import mod dans un module du paquet pkg, vous importez
finalement pkg.mod. Et si vous
exécutez from ..souspkg2 import mod depuis pkg.souspkg1, vous importez
finalement pkg.souspkg2.mod. La spécification des importations relatives se situe
dans la section Importations relatives au paquet.
7.11.1. L'instruction future
Une instruction future est une directive à l'attention du compilateur afin qu'un module
particulier soit compilé en utilisant une syntaxe ou une sémantique qui sera
disponible dans une future version de Python où cette fonctionnalité est devenue un
standard.
Pour une version donnée, le compilateur sait quelles fonctionnalités ont été définies
et lève une erreur à la compilation si une instruction future contient une fonctionnalité
qui lui est inconnue.
Ce n'est pas une instruction future ; c'est une instruction d'importation ordinaire qui
n'a aucune sémantique particulière ou restriction de syntaxe.
Voir aussi
PEP 236 — retour vers le __future__
7.12. L'instruction global
global_stmt ::= "global" identifier ("," identifier)*
Les noms listés dans l'instruction global ne doivent pas être utilisés, dans le même
bloc de code, avant l'instruction global.
Les noms listés dans l'instruction global ne doivent pas être définis en tant que
paramètre formel, cible d'une boucle for, dans une définition de class, de fonction,
d'instruction import ou une annotation de variable.
7.13. L'instruction nonlocal
nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*
L'instruction nonlocal fait que les noms listés font référence aux variables liées
précédemment, dans la portée la plus petite entourant l'instruction, à l'exception des
variables globales. C'est important car le comportement par défaut pour les liaisons
consiste à chercher d'abord dans l'espace des noms locaux. Cette instruction permet
à du code encapsulé de se lier à des variables en dehors de la portée locale du code
mais sans avoir de portée globale (c'est-à-dire de niveau module).
Les noms listés dans l'instruction nonlocal ne doivent entrer en collision avec des
liaisons déjà établies dans la portée locale.
Voir aussi
PEP 3104 -- Accès à des noms en dehors de la portée locale
8. Instructions composées
Les instructions composées contiennent d'autres (groupes d’) instructions ; elles
affectent ou contrôlent l'exécution de ces autres instructions d'une manière ou d'une
autre. En général, une instruction composée couvre plusieurs lignes bien que, dans
sa forme la plus simple, une instruction composée peut tenir sur une seule ligne.
Les instructions if, while et for implémentent les constructions classiques de
contrôle de flux. try spécifie des gestionnaires d'exception et du code de nettoyage
pour un groupe d'instructions, tandis que l'instruction with permet l'exécution de
code d'initialisation et de finalisation autour d'un bloc de code. Les définitions de
fonctions et de classes sont également, au sens syntaxique, des instructions
composées.
Notez également que le point-virgule se lie plus étroitement que le deux-points dans
ce contexte, de sorte que dans l'exemple suivant, soit tous les appels print() sont
exécutés, soit aucun ne l'est :
En résumé :
L'agencement des règles de grammaire dans les sections qui suivent place chaque
clause sur une ligne séparée pour plus de clarté.
8.1. L'instruction if
L'instruction if est utilisée pour exécuter des instructions en fonction d'une
condition :
Elle sélectionne exactement une des suites en évaluant les expressions une par une
jusqu'à ce qu'une soit vraie (voir la section Opérations booléennes pour la définition
de vrai et faux) ; ensuite cette suite est exécutée (et aucune autre partie de
l'instruction if n'est exécutée ou évaluée). Si toutes les expressions sont fausses, la
suite de la clause else, si elle existe, est exécutée.
8.2. L'instruction while
L'instruction while est utilisée pour exécuter des instructions de manière répétée
tant qu'une expression est vraie :
Python évalue l'expression de manière répétée et, tant qu'elle est vraie, exécute la
première suite ; si l'expression est fausse (ce qui peut arriver même lors du premier
test), la suite de la clause else, si elle existe, est exécutée et la boucle se termine.
for i in range(10):
print(i)
i = 5 # this will not affect the for-loop
# because i will be overwritten with the
next
# index in the range
Les noms dans la liste cible ne sont pas supprimés lorsque la boucle est terminée
mais, si la séquence est vide, ils n'auront pas du tout été assignés par la boucle.
Petite astuce : la fonction native range() renvoie un itérateur sur des entiers
approprié pour émuler la boucle classique en Pascal sur des
entiers for i := a to b do ; par exemple, list(range(3)) renvoie la
liste [0, 1, 2].
Note
Il y a une subtilité lorsque la séquence est modifiée par la boucle (cela ne peut se
produire que pour les séquences mutables, c'est-à-dire les listes). Un compteur
interne est utilisé pour savoir quel est l'élément suivant, et ce compteur est
incrémenté à chaque itération. Lorsqu'il a atteint la longueur de la séquence, la
boucle se termine. Cela signifie que si la suite supprime l'élément courant (ou un
élément précédent) de la séquence, l'élément suivant est sauté (puisqu'il reçoit
l'indice de l'élément courant qui a déjà été traité). De même, si la suite insère un
élément avant l'élément courant, l'élément courant est traité une deuxième fois à la
prochaine itération. Ceci peut conduire à de méchants bugs, que vous pouvez éviter
en effectuant une copie temporaire d'une tranche ou de la séquence complète, par
exemple
for x in a[:]:
if x < 0: a.remove(x)
8.4. L'instruction try
L'instruction try spécifie les gestionnaires d'exception ou le code de nettoyage pour
un groupe d'instructions :
except E as N:
foo
except E as N:
try:
foo
finally:
del N
Cela veut dire que l'exception doit être assignée à un nom différent pour pouvoir s'y
référer après la clause except. Les exceptions sont effacées parce qu'avec la trace
de la pile d'appels qui leur est attachée, elles créent un cycle dans les pointeurs de
références (avec le cadre de la pile), ce qui conduit à conserver tous les noms locaux
de ce cadre en mémoire jusqu'au passage du ramasse-miettes.
>>>
>>>
>>> def foo():
... try:
... return 'try'
... finally:
... return 'finally'
...
>>> foo()
'finally'
8.5. L'instruction with
L'instruction with est utilisée pour encapsuler l'exécution d'un bloc avec des
méthodes définies par un gestionnaire de contexte (voir la section Gestionnaire de
contexte With). Cela permet d'utiliser de manière simple le patron de conception
classique try…except…finally.
Note
Si l'on est sorti de la suite en raison d'une exception et que la valeur de retour de la
méthode __exit__() était fausse, l'exception est levée à nouveau. Si la valeur de
retour était vraie, l'exception est supprimée et l'exécution continue avec l'instruction
qui suit l'instruction with.
Si l'on est sorti de la suite pour une raison autre qu'une exception, la valeur de retour
de __exit__() est ignorée et l'exécution se poursuit à l'endroit normal pour le type
de sortie prise.
Avec plus d'un élément, les gestionnaires de contexte sont traités comme si
plusieurs instructions with étaient imbriquées :
est équivalente à
with A() as a:
with B() as b:
suite
Voir aussi
PEP 343 — L'instruction « with »
8.6. Définition de fonctions
Une définition de fonction définit un objet fonction allogène (voir la section Hiérarchie
des types standards) :
Une définition de fonction est une instruction qui est exécutée. Son exécution lie le
nom de la fonction, dans l'espace de nommage local courant, à un objet fonction (un
objet qui encapsule le code exécutable de la fonction). Cet objet fonction contient
une référence à l'espace des noms globaux courant comme espace des noms
globaux à utiliser lorsque la fonction est appelée.
@f1(arg)
@f2
def func(): pass
Les valeurs par défaut des paramètres sont évaluées de la gauche vers la
droite quand la définition de la fonction est exécutée. Cela signifie que
l'expression est évaluée une fois, lorsque la fonction est définie, et que c'est la même
valeur « pré-calculée » qui est utilisée à chaque appel. C'est particulièrement
important à comprendre lorsqu'un paramètre par défaut est un objet mutable, tel
qu'une liste ou un dictionnaire : si la fonction modifie l'objet (par exemple en ajoutant
un élément à une liste), la valeur par défaut est modifiée. En général, ce n'est pas
l'effet voulu. Une façon d'éviter cet écueil est d'utiliser None par défaut et de tester
explicitement la valeur dans le corps de la fonction. Par exemple :
def whats_on_the_telly(penguin=None):
if penguin is None:
penguin = []
penguin.append("property of the zoo")
return penguin
Il est aussi possible de créer des fonctions anonymes (fonctions non liées à un nom),
pour une utilisation immédiate dans des expressions. Utilisez alors des expressions
lambda, décrites dans la section Expressions lambda. Notez qu'une expression
lambda est simplement un raccourci pour définir une fonction simple ; une fonction
définie par une instruction " def" peut être passée (en argument) ou assignée à un
autre nom, tout comme une fonction définie par une expression lambda. La forme
"def" est en fait plus puissante puisqu'elle permet l'exécution de plusieurs
instructions et les annotations.
Note pour les programmeurs : les fonctions sont des objets de première classe.
Une instruction "def" exécutée à l'intérieur d'une définition de fonction définit une
fonction locale qui peut être renvoyée ou passée en tant qu'argument. Les variables
libres utilisées dans la fonction imbriquée ont accès aux variables locales de la
fonction contenant le "def". Voir la section Noms et liaisons pour plus de détails.
Voir aussi
PEP 3107 — Annotations de fonctions
Capacité d'indiquer des types pour les déclarations de variables, y compris les
variables de classes et les variables d'instances
PEP 563 — Évaluation différée des annotations
8.7. Définition de classes
Une définition de classe définit un objet classe (voir la section Hiérarchie des types
standards) :
class Foo:
pass
est équivalente à
class Foo(object):
pass
L'ordre dans lequel les attributs sont définis dans le corps de la classe est préservé
dans le __dict__ de la nouvelle classe. Notez que ceci n'est fiable que juste après
la création de la classe et seulement pour les classes qui ont été définies en utilisant
la syntaxe de définition.
Les classes peuvent aussi être décorées : comme pour les décorateurs de fonctions,
@f1(arg)
@f2
class Foo: pass
Les règles d'évaluation pour les expressions de décorateurs sont les mêmes que
pour les décorateurs de fonctions. Le résultat est alors lié au nom de la classe.
Voir aussi
PEP 3115 — Métaclasses dans Python 3000
8.8. Coroutines
Nouveau dans la version 3.5.
8.8.2. L'instruction async for
async_for_stmt ::= "async" for_stmt
Le code suivant :
iter = (ITER)
iter = type(iter).__aiter__(iter)
running = True
while running:
try:
TARGET = await type(iter).__anext__(iter)
except StopAsyncIteration:
running = False
else:
BLOCK
else:
BLOCK2
Le code suivant :
mgr = (EXPR)
aexit = type(mgr).__aexit__
aenter = type(mgr).__aenter__(mgr)
Voir aussi
PEP 492 — Coroutines avec les syntaxes async et await
La proposition qui a fait que les coroutines soient un concept propre en Python, et a
ajouté la syntaxe de prise en charge de celles-ci.
Notes
L'exception est propagée à la pile d'appels à moins qu'il n'y ait une
clause finally qui lève une autre exception, ce qui entraîne la perte de l'ancienne
exception. Cette nouvelle exception entraîne la perte pure et simple de l'ancienne.
2
La syntaxe d'un programme Python complet est celle d'un fichier d'entrée, dont la
description est donnée dans la section suivante.
L'interpréteur peut également être invoqué en mode interactif ; dans ce cas, il ne lit et
n'exécute pas un programme complet mais lit et exécute une seule instruction
(éventuellement composée) à la fois. L'environnement initial est identique à celui d'un
programme complet ; chaque instruction est exécutée dans l'espace de nommage
de __main__.
Un programme complet peut être transmis à l'interpréteur sous trois formes : avec
l'option -c chaîne en ligne de commande, avec un fichier passé comme premier
argument de ligne de commande ou comme entrée standard. Si le fichier ou l'entrée
standard est un périphérique tty, l'interpréteur entre en mode interactif ; sinon, il
exécute le fichier comme un programme complet.
9.2. Fichier d'entrée
Toutes les entrées lues à partir de fichiers non interactifs sont de la même forme :
lors de l'analyse d'un programme Python complet (à partir d'un fichier ou d'une
chaîne de caractères) ;
lors de l'analyse d'un module ;
lors de l'analyse d'une chaîne de caractères passée à la fonction exec().
9.3. Entrée interactive
L'entrée en mode interactif est analysée à l'aide de la grammaire suivante :
Notez qu'une instruction composée (de niveau supérieur) doit être suivie d'une ligne
blanche en mode interactif ; c'est nécessaire pour aider l'analyseur à détecter la fin
de l'entrée.
9.4. Entrée d'expression
eval() est utilisée pour évaluer les expressions entrées. Elle ignore les espaces en
tête. L'argument de eval(), de type chaîne de caractères, doit être de la forme
suivante :
# NOTE WELL: You should also follow all the steps listed at
# https://devguide.python.org/grammar/
# The reason that keywords are test nodes instead of NAME is that
using NAME
# results in an ambiguity. ast.c makes sure it's a NAME.
# "test '=' test" is really "keyword '=' test", but we have no
such token.
# These need to be in a single rule to avoid grammar that is
ambiguous
# to our LL(1) parser. Even though 'test' includes '*expr' in
star_expr,
# we explicitly match '*' here, too, to give it proper
precedence.
# Illegal combinations and orderings are blocked in ast.c:
# multiple (test comp_for) arguments are blocked; keyword
unpackings
# that precede iterable unpackings are blocked; etc.
argument: ( test [comp_for] |
test '=' test |
'**' test |
'*' test )
La bibliothèque standard de Python est très grande, elle offre un large éventail
d'outils comme le montre la longueur de la table des matières ci-dessous. La
bibliothèque contient des modules natifs (écrits en C) exposant les fonctionnalités du
système telles que les interactions avec les fichiers qui autrement ne seraient pas
accessibles aux développeurs Python, ainsi que des modules écrits en Python
exposant des solutions standardisées à de nombreux problèmes du quotidien du
développeur. Certains de ces modules sont définis explicitement pour encourager et
améliorer la portabilité des programmes Python en abstrayant des spécificités sous-
jacentes en API neutres.
Introduction
o Notes sur la disponibilité
Fonctions natives
Constantes natives
o Constantes ajoutées par le module site
Types natifs
o Valeurs booléennes
o Opérations booléennes --- and, or, not
o Comparaisons
o Types numériques — int, float, complex
o Les types itérateurs
o Types séquentiels — list, tuple, range
o Type Séquence de Texte — str
o Séquences Binaires --- bytes, bytearray, memoryview
o Types d'ensembles — set, frozenset
o Les types de correspondances — dict
o Le type gestionnaire de contexte
o Autres types natifs
o Attributs spéciaux
Exceptions natives
o Classes de base
o Exceptions concrètes
o Avertissements
o Hiérarchie des exceptions
Services de Manipulation de Texte
o string — Opérations usuelles sur des chaînes
o re — Opérations à base d'expressions rationnelles
o difflib — Utilitaires pour le calcul des deltas
o textwrap --- Encapsulation et remplissage de texte
o unicodedata — Base de données Unicode
o stringprep — Préparation des chaines de caractères internet
o readline — interface pour GNU readline
o rlcompleter — Fonction de complétion pour GNU readline
Services autour des Données Binaires
o struct — manipulation de données agrégées sous forme binaire
comme une séquence d'octets
o codecs — Registre des codecs et classes de base associées
Types de données
o datetime — Types de base pour la date et l'heure
o calendar — Fonctions calendaires générales
o collections — Types de données de conteneurs
o collections.abc --- Classes de base abstraites pour les conteneurs
o heapq — File de priorité basée sur un tas
o bisect — Algorithme de bissection de listes
o array — Tableaux efficaces de valeurs numériques
o weakref --- Weak references
o types --- Dynamic type creation and names for built-in types
o copy — Opérations de copie superficielle et récursive
o pprint — L’affichage élégant de données
o reprlib --- Alternate repr() implementation
o enum — Énumerations
Modules numériques et mathématiques
o numbers — Classes de base abstraites numériques
o Fonctions mathématiques — math
o Fonctions mathématiques pour nombres complexes — cmath
o decimal — Arithmétique décimale en virgule fixe et flottante
o fractions — Nombres rationnels
o random --- Génère des nombres pseudo-aléatoires
o statistics — Fonctions mathématiques pour les statistiques
Modules de programmation fonctionnelle
o itertools — Fonctions créant des itérateurs pour boucler
efficacement
o functools --- Fonctions de haut niveau et opérations sur des objets
appelables
o operator — Opérateurs standards en tant que fonctions
Accès aux Fichiers et aux Dossiers
o pathlib — Chemins de système de fichiers orientés objet
o os.path — manipulation courante des chemins
o fileinput --- Iterate over lines from multiple input streams
o stat --- Interpreting stat() results
o filecmp – Comparaisons de fichiers et de répertoires
o tempfile — Génération de fichiers et répertoires temporaires
o glob --- Recherche de chemins de style Unix selon certains motifs
o fnmatch — Filtrage par motif des noms de fichiers Unix
o linecache — Accès direct aux lignes d'un texte
o shutil --- Opérations de haut niveau sur les fichiers
o macpath — Fonctions de manipulation de chemins pour Mac OS 9
Persistance des données
o pickle --- Module de sérialisation d'objets Python
o copyreg — Enregistre les fonctions support de pickle
o shelve — Objet Python persistant
o marshal — Sérialisation interne des objets Python
o dbm --- Interfaces to Unix "databases"
o sqlite3 — Interface DB-API 2.0 pour bases de données SQLite
Compression de donnée et archivage
o zlib — Compression compatible avec gzip
o gzip — Support pour les fichiers gzip
o bz2 — Prise en charge de la compression bzip2
o lzma — Compression via l'algorithme LZMA
o zipfile — Travailler avec des archives ZIP
o tarfile — Lecture et écriture de fichiers d'archives tar
Formats de fichiers
o csv — Lecture et écriture de fichiers CSV
o configparser — Lecture et écriture de fichiers de configuration
o netrc — traitement de fichier netrc
o xdrlib --- Encode and decode XDR data
o plistlib --- Generate and parse Mac OS X .plist files
Service de cryptographie
o hashlib --- Algorithmes de hachage sécurisés et synthèse de
messages
o hmac — Authentification de messages par hachage en combinaison
avec une clé secrète
o secrets — Générer des nombres aléatoires de façon sécurisée pour
la gestion des secrets
Services génériques du système d'exploitation
o os — Diverses interfaces pour le système d'exploitation
o io --- Core tools for working with streams
o time — Accès au temps et conversions
o argparse -- Parseur d'arguments, d'options, et de sous-commandes
de ligne de commande
o getopt – Analyseur de style C pour les options de ligne de commande
o logging — Fonctionnalités de journalisation pour Python
o logging.config --- Logging configuration
o logging.handlers — Gestionnaires de journalisation
o Saisie de mot de passe portable
o curses --- Terminal handling for character-cell displays
o curses.textpad --- Text input widget for curses programs
o curses.ascii --- Utilities for ASCII characters
o curses.panel --- A panel stack extension for curses
o platform — Accès aux données sous-jacentes de la plateforme
o errno — Symboles du système errno standard
o ctypes — Bibliothèque Python d'appels à des fonctions externes
Exécution concourante
o threading — Parallélisme basé sur les fils d’exécution (threads)
o multiprocessing — Parallélisme par processus
o Le paquet concurrent
o concurrent.futures --- Launching parallel tasks
o subprocess — Gestion de sous-processus
o sched --- Event scheduler
o queue — File synchronisée
o _thread — API bas niveau de gestion de fils d'exécution
o _dummy_thread --- Module de substitution pour le module _thread
o dummy_threading --- Module de substitution au module threading
contextvars — Variables de contexte
o Variables de contexte
o Gestion de contexte manuelle
o Gestion avec asyncio
Réseau et communication entre processus
o asyncio — Entrées/Sorties asynchrones
o socket — Gestion réseau de bas niveau
o ssl — Emballage TLS/SSL pour les objets connecteurs
o select --- Waiting for I/O completion
o selectors --- High-level I/O multiplexing
o asyncore — Gestionnaire de socket asynchrone
o asynchat --- Gestionnaire d'interfaces de connexion (socket)
commande/réponse asynchrones
o signal --- Set handlers for asynchronous events
o mmap --- Memory-mapped file support
Traitement des données provenant d'Internet
o email — Un paquet de gestion des e-mails et MIME
o json — Encodage et décodage JSON
o mailcap — Manipulation de fichiers Mailcap
o mailbox — Manipuler les boîtes de courriels dans différents formats
o mimetypes --- Map filenames to MIME types
o base64 — Encodages base16, base32, base64 et base85
o binhex — Encode et décode les fichiers binhex4
o binascii --- Conversion entre binaire et ASCII
o quopri — Encode et décode des données MIME quoted-printable
o uu — Encode et décode les fichiers uuencode
Outils de traitement de balises structurées
o html — Support du HyperText Markup Language
o html.parser --- Simple HTML and XHTML parser
o html.entities — Définitions des entités HTML générales
o Modules de traitement XML
o xml.etree.ElementTree --- The ElementTree XML API
o xml.dom — L'API Document Object Model
o xml.dom.minidom --- Minimal DOM implementation
o xml.dom.pulldom --- Support for building partial DOM trees
o xml.sax — Prise en charge des analyseurs SAX2
o xml.sax.handler --- Base classes for SAX handlers
o xml.sax.saxutils — Utilitaires SAX
o xml.sax.xmlreader --- Interface for XML parsers
o xml.parsers.expat --- Fast XML parsing using Expat
Gestion des protocoles internet
o webbrowser --- Convenient Web-browser controller
o cgi --- Common Gateway Interface support
o cgitb — Gestionnaire d'exceptions pour les scripts CGI
o wsgiref — Outils et implémentation de référence de WSGI
o urllib — Modules de gestion des URLs
o urllib.request --- Extensible library for opening URLs
o urllib.response --- Response classes used by urllib
o urllib.parse --- Parse URLs into components
o urllib.error --- Classes d'exceptions levées par urllib.request
o urllib.robotparser — Analyseur de fichiers robots.txt
o http — modules HTTP
o http.client --- HTTP protocol client
o ftplib --- FTP protocol client
o poplib --- POP3 protocol client
o imaplib --- IMAP4 protocol client
o nntplib --- NNTP protocol client
o smtplib --- SMTP protocol client
o smtpd --- SMTP Server
o telnetlib --- Telnet client
o uuid — Objets UUID d'après la RFC 4122
o socketserver --- A framework for network servers
o http.server --- HTTP servers
o http.cookies — gestion d'état pour HTTP
o http.cookiejar --- Cookie handling for HTTP clients
o xmlrpc — Modules Serveur et Client XMLRPC
o xmlrpc.client --- XML-RPC client access
o xmlrpc.server --- Basic XML-RPC servers
o ipaddress --- IPv4/IPv6 manipulation library
Services multimédia
o audioloop — Manipulation de données audio brutes
o aifc — Lis et écrit dans les fichiers AIFF et AIFC
o sunau --- Read and write Sun AU files
o wave --- Lecture et écriture des fichiers WAV
o chunk --- Read IFF chunked data
o colorsys — Conversions entre les systèmes de couleurs
o imghdr --- Determine the type of an image
o sndhdr — Détermine le type d'un fichier audio
o ossaudiodev --- Access to OSS-compatible audio devices
Internationalisation
o gettext — Services d'internationalisation multilingue
o locale — Services d'internationalisation
Frameworks d'applications
o turtle — Tortue graphique
o cmd — Interpréteurs en ligne de commande.
o shlex --- Simple lexical analysis
Interfaces Utilisateur Graphiques avec Tk
o tkinter — Interface Python pour Tcl/Tk
o tkinter.ttk --- Tk themed widgets
o tkinter.tix --- Extension widgets for Tk
o tkinter.scrolledtext — Gadget texte avec barre de défilement
o IDLE
o Autres paquets d'interface graphique utilisateur
Outils de développement
o typing — Prise en charge des annotations de type
o pydoc — Générateur de documentation et système d’aide en ligne
o doctest --- Test interactive Python examples
o unittest — Framework de tests unitaires
o unittest.mock — Bibliothèque d'objets simulacres
o unittest.mock --- getting started
o 2to3 — Traduction automatique de code en Python 2 vers Python 3
o test --- Regression tests package for Python
o test.support --- Utilities for the Python test suite
o test.support.script_helper --- Utilities for the Python execution
tests
Débogueur et instrumentation
o bdb — Framework de débogage
o faulthandler --- Dump the Python traceback
o pdb — Le débogueur Python
o The Python Profilers
o timeit — Mesurer le temps d'exécution de fragments de code
o trace --- Trace or track Python statement execution
o tracemalloc --- Trace memory allocations
Paquets et distribution de paquets logiciels
o distutils — Création et installation des modules Python
o ensurepip --- Bootstrapping the pip installer
o venv — Création d'environnements virtuels
o zipapp — Gestion des archives zip exécutables Python
Environnement d'exécution Python
o sys — Paramètres et fonctions propres à des systèmes
o sysconfig --- Provide access to Python's configuration information
o builtins — Objets natifs
o __main__ — Point d'entrée des scripts
o warnings --- Contrôle des alertes
o dataclasses — Classes de Données
o contextlib — Utilitaires pour les contextes s'appuyant sur
l'instruction with
o abc — Classes de Base Abstraites
o atexit — Gestionnaire de fin de programme
o traceback --- Print or retrieve a stack traceback
o __future__ — Définitions des futurs
o gc --- Garbage Collector interface
o inspect --- Inspect live objects
o site --- Site-specific configuration hook
Interpréteurs Python personnalisés
o code --- Interpreter base classes
o codeop — Compilation de code Python
Importer des modules
o zipimport — Importer des modules à partir d'archives Zip
o pkgutil --- Package extension utility
o modulefinder — Identifie les modules utilisés par un script
o runpy --- Locating and executing Python modules
o importlib --- The implementation of import
Services du Langage Python
o parser — Accès aux arbres syntaxiques
o ast — Arbres Syntaxiques Abstraits
o symtable --- Access to the compiler's symbol tables
o symbol — Constantes utilisées dans les Arbres Syntaxiques
o token --- Constantes utilisées avec les arbres d'analyse Python (parse
trees)
o keyword — Tester si des chaînes sont des mot-clés Python
o tokenize — Analyseur lexical de Python
o tabnanny — Détection d'indentation ambiguë
o pyclbr --- Python module browser support
o py_compile — Compilation de sources Python
o compileall — Génération du code intermédiaire des bibliothèques
Python
o dis – Désassembleur pour le code intermédiaire de Python
o pickletools --- Tools for pickle developers
Services divers
o formatter --- Generic output formatting
Services spécifiques à MS Windows
o msilib --- Read and write Microsoft Installer files
o msvcrt --- Useful routines from the MS VC++ runtime
o winreg --- Windows registry access
o winsound --- Sound-playing interface for Windows
Services spécifiques à Unix
o posix — Les appels système POSIX les plus courants
o pwd --- The password database
o spwd — La base de données de mots de passe shadow
o grp --- The group database
o crypt --- Function to check Unix passwords
o termios — Le style POSIX le contrôle TTY
o tty — Fonctions de gestion du terminal
o pty — Outils de manipulation de pseudo-terminaux
o fcntl --- The fcntl and ioctl system calls
o pipes — Interface au pipelines shell
o resource --- Resource usage information
o nis — Interface à Sun's NIS (pages jaunes)
o syslog --- Unix syslog library routines
Modules remplacés
o optparse --- Parser for command line options
o imp --- Access the import internals
Modules non Documentés
o Modules spécifiques à une plateforme
Introduction
La "Bibliothèque Python" contient divers composants dans différentes catégories.
Elle contient des types de données qui seraient normalement considérés comme
"fondamentaux" au langage, tel que les nombres et les listes. Pour ces types, le
cœur du langage en définit les écritures littérales et impose quelques contraintes
sémantiques, sans les définir exhaustivement. (Cependant le cœur du langage
impose quelques propriétés comme l'orthographe des attributs ou les
caractéristiques des opérateurs.)
La bibliothèque contient aussi des fonctions et des exceptions natives, pouvant être
utilisées par tout code Python sans import. Certaines sont définies par le noyau de
Python, bien qu'elles ne soient pas toutes essentielles.
Fonctions natives
L'interpréteur Python propose quelques fonctions et types natifs qui sont toujours
disponibles. Ils sont listés ici par ordre alphabétique.
Fonctions
natives
abs() delattr() hash() memoryview() set()
abs(x)
Donne la valeur absolue d'un nombre. L'argument peut être un nombre entier ou un
nombre à virgule flottante. Si l'argument est un nombre complexe, son module est
donné.
all(iterable)
Donne True si tous les éléments de iterable sont vrais (ou s'il est vide), équivaut à :
def all(iterable):
for element in iterable:
if not element:
return False
return True
any(iterable)
Donne True si au moins un élément de iterable est vrai. Faux est aussi donné dans
le cas où iterable est vide, équivaut à :
def any(iterable):
for element in iterable:
if element:
return True
return False
ascii(object)
Donne, tout comme repr(), une chaîne contenant une représentation affichable
d'un objet, en transformant les caractères non ASCII donnés par repr() en utilisant
des séquences d'échappement \x, \u ou \U. Cela génère une chaîne similaire à ce
que renvoie repr() dans Python 2.
bin(x)
Convertit un nombre entier en binaire dans une chaîne avec le préfixe 0b. Le résultat
est une expression Python valide. Si x n'est pas un int, il doit définir une méthode
__index__() donnant un nombre entier, voici quelques exemples :
>>> bin(3)
'0b11'
>>> bin(-10)
'-0b1010'
Que le préfixe 0b soit souhaité ou non, vous pouvez utiliser les moyens suivants.
class bool([x])
Donne une valeur booléenne, c'est à dire soit True, soit False. x est converti en
utilisant la procédure standard d'évaluation de valeur de vérité. Si x est faux, ou
omis, elle donne False, sinon, elle donne True. La classe bool hérite de la
classe int (voir Types numériques — int, float, complex). Il n'est pas possible d'en
hériter. Ses seules instances sont False et True (voir Valeurs booléennes).
breakpoint(*args, **kws)
Cette fonction vous place dans le débogueur lorsqu'elle est appelée. Plus
précisément, elle appelle sys.breakpointhook(), en lui passant les
arguments args et kws. Par
défaut, sys.breakpointhook() appelle pdb.set_trace() qui n'attend aucun
argument. Dans ce cas, c'est purement une fonction de commodité donc vous n'avez
pas à importer explicitement pdb ou à taper plus de code pour entrer dans le
débogueur. Cependant, sys.breakpointhook() peut-être paramétré pour une
autre fonction et breakpoint() l'appellera automatiquement, vous permettant ainsi
de basculer dans le débogueur de votre choix.
class bytearray([source[, encoding[, errors]]])
Donne un nouveau tableau d'octets. La classe bytearray est une séquence muable
de nombre entiers dans l'intervalle 0 <= x < 256. Il possède la plupart des méthodes
des séquences variables, décrites dans Types de séquences muables, ainsi que la
plupart des méthodes de la classe bytes, voir Opérations sur les bytes et bytearray.
class bytes([source[, encoding[, errors]]])
Donne un nouvel objet bytes, qui est une séquence immuable de nombre entiers
dans l'intervalle 0 <= x <= 256. Les bytes est une version immuable
de bytearray -- avec les mêmes méthodes d'accès, et le même comportement lors
de l'indexation ou la découpe.
callable(object)
Return True if the object argument appears callable, False if not. If this
returns True, it is still possible that a call fails, but if it is False, calling object will
never succeed. Note that classes are callable (calling a class returns a new
instance); instances are callable if their class has a __call__() method.
Nouveau dans la version 3.2: Cette fonction à d'abord été supprimée avec Python
3.0 puis elle à été remise dans Python 3.2.
chr(i)
Renvoie la chaîne représentant un caractère dont le code de caractère Unicode est
le nombre entier i. Par exemple, chr(97) renvoie la chaîne de caractères 'a',
tandis que chr(8364) renvoie '€'. Il s'agit de l'inverse de ord().
@classmethod
Transforme une méthode en méthode de classe.
Une méthode de classe reçoit implicitement la classe en premier argument, tout
comme une méthode d'instance reçoit l'instance. Voici comment déclarer une
méthode de classe :
class C:
@classmethod
def f(cls, arg1, arg2, ...): ...
Elle peut être appelée soit sur la classe (comme C.f()) ou sur une instance
(comme C().f()). L'instance est ignorée, sauf pour déterminer sa classe. Si la
méthode est appelée sur une instance de classe fille, c'est la classe fille qui sera
donnée en premier argument implicite.
Les méthodes de classe sont différentes des méthodes statiques du C++ ou du Java.
Si c'est elles sont vous avez besoin, regardez du côté de staticmethod().
Pour plus d'informations sur les méthodes de classe, consultez Hiérarchie des types
standards.
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
Compile source en un objet code ou objet AST. Les objets code peuvent être
exécutés par exec() ou eval(). source peut soit être une chaîne, un objet bytes,
ou un objet AST. Consultez la documentation du module ast pour des informations
sur la manipulation d'objets AST.
L'argument mode indique quel type de code doit être compilé : 'exec' si source est
une suite d'instructions, 'eval' pour une seule expression, ou 'single' si il ne
contient qu'une instruction interactive (dans ce dernier cas, les résultats
d'expressions donnant autre chose que None seront affichés).
Les instructions futures sont spécifiées par des bits, il est ainsi possible d'en spécifier
plusieurs en les combinant avec un ou binaire. Les bits requis pour spécifier une
certaine fonctionnalité se trouvent dans l'attribut compiler_flag de la
classe Feature du module __future__.
Note
Avertissement
Il est possible de faire planter l'interpréteur Python avec des chaînes suffisamment
grandes ou complexes lors de la compilation d'un objet AST à cause de la limitation
de la profondeur de la pile d'appels.
class complex([real[, imag]])
Donne un nombre complexe de valeur real + imag\*1j, ou convertit une chaîne
ou un nombre en nombre complexe. Si le premier paramètre est une chaîne, il sera
interprété comme un nombre complexe et la fonction doit être appelée dans second
paramètre. Le second paramètre ne peut jamais être une chaîne. Chaque argument
peut être de n'importe quel type numérique (même complexe). Si imag est omis, sa
valeur par défaut est zéro, le constructeur effectue alors une simple conversion
numérique comme le font int ou float. Si aucun argument n'est fourni, donne 0j.
Note
Lors de la conversion depuis une chaîne, elle ne doit pas contenir d'espaces autour
des opérateurs binaires + ou -. Par exemple complex('1+2j') est bon,
mais complex('1 + 2j') lève une ValueError.
Modifié dans la version 3.6: Les chiffres peuvent être groupés avec des tirets bas
comme dans les expressions littérales.
delattr(object, name)
C'est un cousin de setattr(). Les arguments sont un objet et une chaîne. La
chaîne doit être le nom de l'un des attributs de l'objet. La fonction supprime l'attribut
nommé, si l'objet l'y autorise. Par exemple delattr(x, 'foobar') est l'équivalent
de del x.foobar.
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)
Créé un nouveau dictionnaire. L'objet dict est la classe du dictionnaire.
Voir dict et Les types de correspondances — dict pour vous documenter sur cette
classe.
Pour les autres conteneurs, voir les classes natives list, set, et typle. ainsi que le
module collections.
dir([object])
Sans arguments, elle donne la liste des noms dans l'espace de nommage local. Avec
un argument, elle essaye de donner une liste d'attributs valides pour cet objet.
Si l'objet à une méthode __dir__(), elle est appelée et doit donner une liste
d'attributs. Cela permet aux objets
implémentant __getattr__() ou __getattribute__() de personnaliser ce que
donnera dir().
Si l'objet est un module, la liste contiendra les noms des attributs du module.
Si l'objet est un type ou une classe, la liste contiendra les noms de ses
attributs, et récursivement, des attributs de ses parents.
Autrement, la liste contient les noms des attributs de l'objet, le nom des
attributs de la classe, et récursivement des attributs des parents de la classe.
Étant donné que dir() est d'abord fournie pour son côté pratique en mode interactif,
elle a tendance à fournir un jeu intéressant de noms plutôt qu'un ensemble
consistant et rigoureusement défini, son comportement peut aussi changer d'une
version à l'autre. Par exemple, les attributs de méta-classes ne sont pas données
lorsque l'argument est une classe.
divmod(a, b)
Prend deux nombres (non complexes) et donne leur quotient et reste de leur division
entière sous forme d'une paire de nombres. Avec des opérandes de types différents,
les règles des opérateurs binaires s'appliquent. Pour deux entiers le résultat est le
même que (a // b, a % b). Pour des nombres à virgule flottante le résultat
est (q, a % b), où q est généralement math.floor(a / b) mais peut valoir un
de moins. Dans tous les cas q * b + a % b est très proche de a. Si a % b est
différent de zéro, il a le même signe que b, et 0 <= abs(a % b) < abs(b).
enumerate(iterable, start=0)
Donne un objet énumérant. iterable doit être une séquence, un iterator, ou tout autre
objet supportant l'itération. La méthode __next__() de l'itérateur donné
par enumerate() donne un tuple contenant un compte (démarrant à start, 0 par
défaut) et les valeurs obtenues de l'itération sur iterable.
Équivalent à :
>>> x = 1
>>> eval('x+1')
2
Cette fonction peut aussi être utilisée pour exécuter n'importe quel objet code (tel
que ceux créés par compile()). Dans ce cas, donnez un objet code plutôt qu'une
chaîne. Si l'objet code à été compilé avec 'exec' en argument
pour mode, eval() donnera None.
exec(object[, globals[, locals]])
Cette fonction permet l'exécution dynamique de code Python. object doit être soit
une chaîne soit un objet code. Si c'est une chaîne, elle est d'abord analysée en une
suite d'instructions Python qui sont ensuite exécutés (sauf erreur de syntaxe). 1 Si
c'est un objet code, il est simplement exécuté. dans tous les cas, le code fourni doit
être valide selon les mêmes critères que s'il était un script dans un fichier (voir la
section "File Input" dans le manuel). Gardez en tête que les mots
clefs return et yield ne peuvent pas être utilisés en dehors d'une fonction, même
dans du code passé à exec(). La fonction donne None.
Dans tous les cas, si les arguments optionnels sont omis, le code est exécuté dans
le contexte actuel. Si seul globals est fourni, il doit être un dictionnaire qui sera utilisé
pour les globales et les locales. Si les deux sont fournis, ils sont utilisés
respectivement pour les variables globales et locales. locales peut être n'importe
quel objet mapping. Souvenez vous qu'au niveau d'un module, les dictionnaires des
locales et des globales ne sont qu'un. Si exec reçoit deux objets distincts
dans globals et locals, le code sera exécuté comme s'il était inclus dans une
définition de classe.
Note
Note
class float([x])
Donne un nombre a virgule flottante depuis un nombre ou une chaîne x.
Exemples :
>>>
>>> float('+1.23')
1.23
>>> float(' -12345\n')
-12345.0
>>> float('1e-003')
0.001
>>> float('+1E6')
1000000.0
>>> float('-Infinity')
-inf
Modifié dans la version 3.6: Les chiffres peuvent être groupés avec des tirets bas
comme dans les expressions littérales.
format(value[, format_spec])
Convertit une valeur en sa représentation "formatée", tel que décrit par format_spec.
L'interprétation de format_spec dépend du type de la valeur, cependant il existe une
syntaxe standard utilisée par la plupart des types natifs : Mini-langage de
spécification de format.
Par défaut, format_spec est une chaîne vide qui généralement donne le même effet
qu'appeler str(value).
class frozenset([iterable])
Donne un nouveau frozenset, dont les objets sont éventuellement tirés
d'iterable. frozenset est une classe native. Voir frozenset et Types d'ensembles
— set, frozenset pour leurs documentation.
getattr(object, name[, default])
Donne la valeur de l'attribut nommé name de l'objet object. name doit être une
chaîne. Si la chaîne est le nom d'un des attributs de l'objet, le résultat est la valeur de
cet attribut. Par exemple, getattr(x, 'foobar') est équivalent à x.foobar. Si
l'attribut n'existe pas, et que default est fourni, il est renvoyé, sinon
l'exception AttributeError est levée.
globals()
Donne une représentation de la table de symboles globaux sous forme d'un
dictionnaire. C'est toujours le dictionnaire du module courant (dans une fonction ou
méthode, c'est le module où elle est définie, et non le module d'où elle est appelée).
hasattr(object, name)
Les arguments sont : un objet et une chaîne. Le résultat est True si la chaîne est le
nom d'un des attributs de l'objet, sinon False. (L'implémentation
appelle getattr(object, name) et regarde si une exception AttributeError à
été levée.)
hash(object)
Donne la valeur de hash d'un objet (s'il en a une). Les valeurs de hash sont des
entiers. Elles sont utilisées pour comparer rapidement des clefs de dictionnaire lors
de leur recherche. Les valeurs numériques égales ont le même hash (même si leurs
types sont différents, comme pour 1 et 1.0).
Note
help([object])
Invoque le système d'aide natif. (Cette fonction est destinée à l'usage en mode
interactif.) Soi aucun argument n'est fourni, le système d'aide démarre dans
l'interpréteur. Si l'argument est une chaîne, un module, une fonction, une classe, une
méthode, un mot clef, ou un sujet de documentation pourtant ce nom est recherché,
et une page d'aide est affichée sur la console. Si l'argument est d'un autre type, une
page d'aide sur cet objet est générée.
Notez que si une barre oblique (/) apparaît dans la liste des paramètres d'une
fonction, lorsque vous appelez help(), cela signifie que les paramètres placés avant
la barre oblique sont uniquement positionnels. Pour plus d'informations, voir La FAQ
sur les arguments positionels.
hex(x)
Convertit un entier en chaîne hexadécimale préfixée de 0x. Si x n'est pas un int, il
doit définir une méthode __index__() qui renvoie un entier. Quelques exemples :
>>> hex(255)
'0xff'
>>> hex(-42)
'-0x2a'
Note
Pour obtenir une représentation hexadécimale sous forme de chaîne d'un nombre à
virgule flottante, utilisez la méthode float.hex().
id(object)
Donne l'"identité" d'un objet. C'est un nombre entier garanti unique et constant pour
cet objet durant sa durée de vie. Deux objets sont les durées de vie ne se
chevauchent pas peuvent partager le même id().
>>>
>>> s = input('--> ')
--> Monty Python's Flying Circus
>>> s
"Monty Python's Flying Circus"
class int([x])
class int(x, base=10)
Donne un entier construit depuis un nombre ou une chaîne x, ou 0 si aucun
argument n'est fourni. Si x définit une
méthode __int__(), int(x) renvoie x.__int__().
Si x définit __trunc__(), int(x) renvoie x.__trunc__(). Les nombres à virgule
flottante sont tronqués vers zéro.
Le type des entiers est décrit dans Types numériques — int, float, complex.
Modifié dans la version 3.4: Si base n'est pas une instance d'int et que base a une
méthode base.__index__, cette méthode est appelée pour obtenir un entier pour
cette base. Les versions précédentes utilisaient base.__int__ au lieu
de base.__index__.
Modifié dans la version 3.6: Les chiffres peuvent être groupés avec des tirets bas
comme dans les expressions littérales.
isinstance(object, classinfo)
Return True if the object argument is an instance of the classinfo argument, or of a
(direct, indirect or virtual) subclass thereof. If object is not an object of the given type,
the function always returns False. If classinfo is a tuple of type objects (or
recursively, other such tuples), return True if object is an instance of any of the
types. If classinfo is not a type or tuple of types and such tuples,
a TypeError exception is raised.
issubclass(class, classinfo)
Return True if class is a subclass (direct, indirect or virtual) of classinfo. A class is
considered a subclass of itself. classinfo may be a tuple of class objects, in which
case every entry in classinfo will be checked. In any other case,
a TypeError exception is raised.
iter(object[, sentinel])
Donne un objet iterator. Le premier argument est interprété très différemment en
fonction de la présence du second argument. Sans second argument, object doit être
une collection d'objets supportant le protocole d'itération (la méthode __iter__()),
ou supportant le protocole des séquences (la méthode getitem(), avec des
nombres entiers commençant par 0 comme argument). S'il ne supporte aucun de ces
protocoles, TypeError est levée. Si le second argument sentinel est
fourni, objet doit être appelable. L'itérateur créé dans ce cas appellera object dans
argument à chaque appel de __next__(), si la valeur reçue est égale
à sentinel StopIteration est levée, autrement la valeur est donnée.
class list([iterable])
Plutôt qu'être une fonction, list est en fait un type de séquence variable, tel que
documenté dans Listes et Types séquentiels — list, tuple, range.
locals()
Met à jour et donne un dictionnaire représentant la table des symboles locaux. Les
variables libres sont données par locals() lorsqu'elle est appelée dans le corps
d'une fonction, mais pas dans le corps d'une classe. Notez qu’au niveau d’un
module, locals() globals() sont le même dictionnaire.
Note
max(iterable, *[, key, default])
max(arg1, arg2, *args[, key])
Donne l'élément le plus grand dans un itérable, ou l'argument le plus grand parmi au
moins deux arguments.
Si un seul argument positionnel est fourni, il doit être iterable. Le plus grand élément
de l'itérable est donné. Si au moins deux arguments positionnels sont fournis,
l'argument le plus grand sera donné.
Elle accepte deux arguments par mot clef optionnels. L'argument key spécifie une
fonction à un argument permettant de trier comme pour list.sort().
L'argument default quant à lui fournit un objet à donner si l'itérable fourni est vide. Si
l'itérable est vide et que default n'est pas fourni, ValueError est levée.
class memoryview(obj)
Donne une "vue mémoire" (memory view) créée depuis l'argument. Voir Vues de
mémoires pour plus d'informations.
min(iterable, *[, key, default])
min(arg1, arg2, *args[, key])
Donne le plus petit élément d'un itérable ou le plus petit d'au moins deux arguments.
Si un seul argument est fourni, il doit être iterable. Le plus petit élément de l'itérable
est donné. Si au moins deux arguments positionnels sont fournis le plus petit
argument positionnel est donné.
Elle accepte deux arguments par mot clef optionnels. L'argument key spécifie une
fonction à un argument permettant de trier comme pour list.sort().
L'argument default quant à lui fournit un objet à donner si l'itérable fourni est vide. Si
l'itérable est vide et que default n'est pas fourni, ValueError est levée.
next(iterator[, default])
Donne l'élément suivant d'iterator en appelant sa méthode __next__().
Si default est fourni, il sera donné si l'itérateur est épuisé, sinon StopIteration est
levée.
class object
Donne un objet vide. object est la classe parente de toute les classes. C'est elle qui
porte les méthodes communes à toutes les instances de classes en Python. Cette
fonction n'accepte aucun argument.
Note
>>> oct(8)
'0o10'
>>> oct(-56)
'-0o70'
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, clo
sefd=True, opener=None)
Ouvre file et donne un file object correspondant. Si le fichier ne peut pas être ouvert,
une OSError est levée.
mode est une chaîne optionnelle permettant de spécifier dans quel mode le fichier
est ouvert. Par défaut, mode vaut 'r' qui signifie "ouvrir en lecture pour du
texte". 'w' est aussi une valeur classique, permettant d'écrire (vidant le fichier s'il
existe), ainsi que 'x' permettant une création exclusive et 'a' pour ajouter à la fin
du fichier (qui sur certains systèmes Unix signifie que toutes les écritures seront des
ajouts en fin de fichier peu importe la position demandée). En mode texte,
si encoding n'est pas spécifié l'encodage utilisé est dépendant de la
plateforme : locale.getpreferredencoding(False) est appelée pour obtenir
l'encodage de la locale actuelle. (Pour lire et écrire des octets bruts, utilisez le mode
binaire en laissant encoding non spécifié.) Les modes disponibles sont :
Caractèr
Signification
e
'r' ouvre en lecture (par défaut)
'w' ouvre en écriture, tronquant le fichier
'x' ouvre pour une création exclusive, échouant si le fichier existe déjà
'a' ouvre en écriture, ajoutant à la fin du fichier s'il existe
'b' mode binaire
't' mode texte (par défaut)
'+' ouvre un fichier pour le modifier (lire et écrire)
Les mode par défaut est 'r' (ouvrir pour lire du texte, synonyme de 'rt'). Pour un
accès en lecture écriture binaire, le mode 'w+b' ouvre et vide le fichier. 'r+b' ouvre
le fichier sans le vider.
Tel que mentionné dans Aperçu, Python fait la différence entre les I/O binaire et
texte. Les fichiers ouverts en mode binaire (avec 'b' dans mode) donnent leur
contenu sous forme de bytes sans décodage. En mode texte (par défaut, ou
lorsque 't' est dans le mode), le contenu du fichier est donné sous forme de str,
les octets ayant été décodés au préalable en utilisant un encodage déduit de
l'environnement ou encoding s'il est donné.
Note
Les fichiers binaires sont les dans un tampon de taille fixe, dont la taille est
choisie par une heuristique essayant de déterminer la taille des blocs du système
sous-jacent, ou en utilisant par défaut io.DEFAULT_BUFFER_SIZE. Sur de nombreux
systèmes, le tampon sera de 4096 ou 8192 octets.
Les fichiers texte "interactifs" (fichiers pour
lesquels io.IOBase.isatty() donne True) utilisent un tampon par lignes. Les
autres fichiers texte sont traités comme les fichiers binaires.
>>>
>>> import os
>>> dir_fd = os.open('somedir', os.O_RDONLY)
>>> def opener(path, flags):
... return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('spamspam.txt', 'w', opener=opener) as f:
... print('This will be written to somedir/spamspam.txt',
file=f)
...
>>> os.close(dir_fd) # don't leak a file descriptor
pow(x, y[, z])
Donne x puissance y, et si z est présent, donne x puissance y modulo z (calculé de
manière plus efficiente que pow(x, y) % z). La forme à deux arguments est
équivalent à x**y.
Les arguments doivent être de types numériques. Avec des opérandes de différents
types, les mêmes règles de coercition que celles des opérateurs arithmétiques
binaires s'appliquent. Pour des opérandes de type int, le résultat sera de même
type que les opérandes (après coercition) sauf si le second argument est négatif,
dans ce cas, les arguments sont convertis en float, et le résultat sera
un float aussi. Par exemple, 10**2 donne 100, alors que 10**-2 donne 0.01. Si
le second argument est négatif, le troisième doit être omis. Si z est
fourni, x et y doivent être des entiers et y positif.
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Écrit objects dans le flux texte file, séparés par sep et suivis de end. sep, end, file,
et flush, s'ils sont présents, doivent être données par mot clef.
Tous les arguments positionnels sont convertis en chaîne comme le fait str(), puis
écrits sur le flux, séparés par sep et terminés par end. sep et end doivent être des
chaînes, ou None , indiquant de prendre les valeurs par défaut. Si
aucun objects n'est donné print() écris seulement end.
Que la sortie utilise un buffer ou non est souvent décidé par file, mais si
l'argument flush est vrai, le tampon du flux est vidé explicitement.
class property(fget=None, fset=None, fdel=None, doc=None)
Donne un attribut propriété.
fget est une fonction permettant d'obtenir la valeur d'un attribut. fset est une fonction
pour en définir la valeur. fdel quand à elle permet de supprimer la valeur d'un attribut,
et doc créé une docstring pour l'attribut.
class C:
def __init__(self):
self._x = None
def getx(self):
return self._x
def delx(self):
del self._x
class Parrot:
def __init__(self):
self._voltage = 100000
@property
def voltage(self):
"""Get the current voltage."""
return self._voltage
class C:
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
Ce code est l'exact équivalent du premier exemple. Soyez attentifs à bien donner aux
fonctions additionnelles le même nom que la propriété ( x dans ce cas.)
class range(stop)
class range(start, stop[, step])
Plutôt qu'être une fonction, range est en fait une séquence immuable, tel que
documenté dans Ranges et Types séquentiels — list, tuple, range.
repr(object)
Donne une chaîne contenant une représentation affichable de l'objet. Pour de
nombreux types, cette fonction essaye de donner une chaîne qui donnera à son tour
un objet de mène valeur lorsqu'elle est passée à eval(), sinon la représentation
sera une chaîne entourée de chevrons contenant le nom du type et quelques
informations supplémentaires souvent le nom et l'adresse de l'objet. Une classe peut
contrôler ce que cette fonction donne pour ses instances en définissant une
méthode __repr__().
reversed(seq)
Donne un iterator inversé. seq doit être un objet ayant une
méthode __reverse__() ou supportant le protocole séquence (la
méthode __len__() et la méthode __getitem__() avec des arguments entiers
commençant à zéro).
round(number[, ndigits])
Renvoie number arrondi avec une précision de ndigits chiffres après la virgule.
Si ndigits est omis (ou est None), l'entier le plus proche est renvoyé.
Pour les types natifs supportant round(), les valeurs sont arrondies au multiple de
10 puissance moins ndigits, si deux multiples sont équidistants, l'arrondi se fait vers
la valeur paire (par exemple round(0.5) et round(-0.5) valent tous les deux 0,
et round(1.5) vaut 2). ndigits accepte tout nombre entier (positif, zéro, ou négatif).
La valeur renvoyée est un entier si ndigits n'est pas donné, (ou est None). Sinon elle
est du même type que number.
Note
class set([iterable])
Donne un nouveau set, dont les éléments peuvent être extraits d'iterable. set est
une classe native. Voir set et Types d'ensembles — set, frozenset pour la
documentation de cette classe.
D'autres conteneurs existent, typiquement : frozenset, list, tuple, et dict, ainsi
que le module collections.
setattr(object, name, value)
C'est le complément de getattr(). Les arguments sont : un objet, une chaîne, et
une valeur de type arbitraire. La chaîne peut nommer un attribut existant ou un
nouvel attribut. La fonction assigne la valeur à l'attribut, si l'objet l'autorise. Par
exemple, setattr(x, 'foobar', 123) équivaut à x.foobar = 123.
class slice(stop)
class slice(start, stop[, step])
Donne un objet slice représentant un ensemble d'indices spécifiés
par range(start, stop, step). Les arguments start et step valent None par
défaut. Les objets slice (tranches) ont les attributs suivants en lecture
seule : start, stop, et step qui valent simplement les trois arguments (ou leurs
valeur par défaut). Ils n'ont pas d'autres fonctionnalité explicite, cependant ils sont
utilisés par Numerical Python et d'autres bibliothèques tierces. Les objets slice sont
aussi générés par la notation par indices étendue. Par
exemple a[start:stop:step] ou a[start:stop, i].
Voir itertools.islice() pour une version alternative donnant un itérateur.
sorted(iterable, *, key=None, reverse=False)
Donne une nouvelle liste triée depuis les éléments d'iterable.
A deux arguments optionnels qui doivent être fournis par mot clef.
key spécifie une fonction d'un argument utilisé pour extraire une clef de comparaison
de chaque élément de l'itérable (par exemple, key=str.lower). La valeur par
défaut est None (compare les éléments directement).
reverse, une valeur booléenne. Si elle est True, la liste d'éléments est triée comme
si toutes les comparaisons étaient inversées.
@staticmethod
Transforme une méthode en méthode statique.
class C:
@staticmethod
def f(arg1, arg2, ...): ...
Elle peut être appelée soit sur une classe (tel que C.f()) ou sur une instance (tel
que C().f()).
class C:
builtin_open = staticmethod(open)
Pour plus d'informations sur les méthodes statiques, consultez Hiérarchie des types
standards.
class str(object='')
class str(object=b'', encoding='utf-8', errors='strict')
Donne une version sous forme de str d'object. Voir str() pour plus de détails.
sum(iterable[, start])
Additionne start et les éléments d'iterable de gauche à droite et en donne le
total. start vaut 0 par défaut. Les éléments d'iterable sont normalement des nombres,
et la valeur de start ne peut pas être une chaîne.
Pour certains cas, il existe de bonnes alternatives à sum(). La bonne méthode, et
rapide, de concaténer une séquence de chaînes est d'appeler ''.join(séquence).
Pour additionner des nombres à virgule flottante avec une meilleure précision,
voir math.fsum(). Pour concaténer une série d'itérables, utilisez
plutôt itertools.chain().
super([type[, object-or-type]])
Donne un objet mandataire (proxy object en anglais) déléguant les appels de
méthode à une classe parente ou sœur de type type. C'est utile pour accéder à des
méthodes héritées et substituées dans la classe. L'ordre de recherche est le même
que celui utilisé par getattr() sauf que type lui même est sauté.
Il existe deux autres cas d'usage typiques pour super. Dans une hiérarchie de
classes à héritage simple, super peut être utilisé pour obtenir la classe parente sans
avoir à la nommer explicitement, rendant le code plus maintenable. Cet usage se
rapproche de l'usage de super dans d'autres langages de programmation.
Dans tous les cas, un appel typique à une classe parente ressemble à :
class C(B):
def method(self, arg):
super().method(arg) # This does the same thing as:
# super(C, self).method(arg)
In addition to method lookups, super() also works for attribute lookups. One
possible use case for this is calling descriptors in a parent or sibling class.
class tuple([iterable])
Plutôt qu'être une fonction, tuple est en fait un type de séquence immuable, tel que
documenté dans Tuples et Types séquentiels — list, tuple, range.
class type(object)
class type(name, bases, dict)
Avec un argument, donne le type d'object. La valeur donnée est un objet type et
généralement la même que la valeur de l'attribut object.__class__.
Avec trois arguments, renvoie un nouveau type. C'est essentiellement une forme
dynamique de l'instruction class. La chaîne name est le nom de la classe et
deviendra l'attribut __name__ ; le tuple bases contient les classes mères et
deviendra l'attribut __bases__ ; et le dictionnaire dict est l'espace de nommage
contenant les définitions du corps de la classe, il est copié vers un dictionnaire
standard pour devenir l'attribut __dict__. Par exemple, les deux instructions
suivantes créent deux instances identiques de type :
>>> class X:
... a = 1
...
>>> X = type('X', (object,), dict(a=1))
vars([object])
Renvoie l'attribut __dict__ d'un module, d'une classe, d'une instance ou de
n'importe quel objet avec un attribut __dict__.
zip(*iterables)
Construit un itérateur agrégeant les éléments de tous les itérables.
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
sentinel = object()
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterators:
elem = next(it, sentinel)
if elem is sentinel:
return
result.append(elem)
yield tuple(result)
Il est garanti que les itérables soient évalués de gauche a droite. Cela rend possible
de grouper une séquence de données en groupes de
taille n via zip(*[iter(s)]*n). Cela duplique le même itérateur n fois tel que le
tuple obtenu contient le résultat de n appels à l'itérateur. Cela a pour effet de diviser
la séquence en morceaux de taille n.
zip() ne devrait être utilisée avec des itérables de longueur différente que lorsque
les dernières données des itérables les plus longs peuvent être ignorées. Si c'est
valeurs sont importantes, utilisez plutôt itertools.zip_longest().
>>>
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True
__import__(name, globals=None, locals=None, fromlist=(), level=0)
Note
C'est une fonction avancée qui n'est pas fréquemment nécessaire, contrairement
à importlib.import_module().
Cette fonction est invoquée via l'instruction import. Elle peut être remplacée (en
important le module builtins et en y remplaçant builtins.__import__) afin de
changer la sémantique de l'instruction import, mais c'est extrêmement déconseillé
car il est plus simple d'utiliser des points d'entrées pour les importations (import
hooks, voir la PEP 302) pour le même résultat sans gêner du code s'attendant à
trouver l'implémentation par défaut. L'usage direct de __import__() est aussi
déconseillé en faveur de importlib.import_module().
L'instruction import ham.ham appelle :
En revanche,
l'instruction from spam.ham import eggs, sausage as saus donne
Modifié dans la version 3.3: Des valeurs négatives pour level ne sont plus gérées (ce
qui change la valeur par défaut pour 0).
Notes
1
Notez que l'analyseur n'accepte que des fin de lignes de style Unix. Si vous lisez le
code depuis un fichier, assurez-vous d'utiliser la conversion de retours à la ligne pour
convertir les fin de lignes Windows et Mac.
Constantes natives
Un petit nombre de constantes existent dans le namespace natif. Elles sont :
False
La valeur fausse du type bool. Les assignations à False ne sont pas autorisées et
lèvent une SyntaxError.
True
La valeur vraie du type bool. Les assignations à True ne sont pas autorisées et
lèvent une SyntaxError.
None
None est l'unique valeur du type NoneType. Elle est utilisée fréquemment pour
représenter l'absence de valeur, comme lorsque des arguments par défaut ne sont
pas passés à une fonction. Les assignations à None ne sont pas autorisées et lèvent
une SyntaxError.
NotImplemented
Valeur spéciale qui devrait être renvoyée par les méthodes magiques à deux
opérandes (e.g. __eq__(), __lt__(), __add__(), __rsub__(), etc.) pour indiquer
que l'opération n'est pas implémentée pour l'autre type ; peut être renvoyé par les
méthodes magiques augmentées à deux opérandes
(e.g. __imul__(), __iand__(), etc.) avec le même objectif. Sa valeur booléenne
est True.
Note
__debug__
Cette constante est vraie si Python n'a pas été démarré avec une option -O. Voir
aussi l'expression assert.
Note
quit(code=None)
exit(code=None)
Objets qui, lorsqu'ils sont représentés, affichent un message comme "Use quit() or
Ctrl-D (i.e. EOF) to exit", et lorsqu'ils sont appelés, lèvent un SystemExit avec le
code de retour spécifié.
copyright
credits
Objets qui, lorsqu'ils sont affichés ou appelés, affichent le copyright ou les crédits,
respectivement.
license
Objet qui, lorsqu'il est affiché, affiche un message comme "Type license() to see the
full license text", et lorsqu'il est appelé, affiche le texte complet de la licence dans un
style paginé (un écran à la fois).
Types natifs
Les sections suivantes décrivent les types standards intégrés à l'interpréteur.
Les principaux types natifs sont les numériques, les séquences, les dictionnaires, les
classes, les instances et les exceptions.
Certaines classes de collection sont muables. Les méthodes qui ajoutent, retirent, ou
réorganisent leurs éléments sur place, et qui ne renvoient pas un élément spécifique,
ne renvoient jamais l'instance de la collection elle-même, mais None.
Valeurs booléennes
Tout objet peut être comparé à une valeur booléenne, typiquement dans une
condition if ou while ou comme opérande des opérations booléennes ci-dessous.
Par défaut, tout objet est considéré vrai à moins que sa classe définisse soit une
méthode __bool__() renvoyant False soit une méthode __len__() renvoyant
zéro lorsqu'elle est appelée avec l'objet. 1 Voici la majorité des objets natifs
considérés comme étant faux :
Opératio
Résultat Notes
n
x or y si x est faux, alors y, sinon x (1)
x and y si x est faux, alors x, sinon y (2)
not x si x est faux, alors True, sinon False (3)
Notes :
Comparaisons
Il y a huit opérations de comparaison en Python. Elles ont toutes la même priorité
(qui est supérieure à celle des opérations booléennes). Les comparaisons peuvent
être enchaînées arbitrairement ; par exemple, x < y <= z est équivalent
à x < y and y <= z, sauf que y n'est évalué qu'une seule fois (mais dans les deux
cas z n'est pas évalué du tout quand x < y est faux).
Les instances d'une classe ne peuvent pas être ordonnées par rapport à d'autres
instances de la même classe, ou d'autres types d'objets, à moins que la classe ne
définisse suffisamment de méthodes
parmi __lt__(), __le__(), __gt__() et __ge__() (en
général, __lt__() et __eq__() sont suffisantes, si vous voulez les significations
classiques des opérateurs de comparaison).
Les nombres sont créés par des littéraux numériques ou sont le résultat de fonctions
natives ou d'opérateurs. Les entiers littéraux basiques (y compris leur forme
hexadécimale, octale et binaire) donnent des entiers. Les nombres littéraux
contenant un point décimal ou un exposant donnent des nombres à virgule flottante.
Suffixer 'j' ou 'J' à un nombre littéral donne un nombre imaginaire (un nombre
complexe avec une partie réelle nulle) que vous pouvez ajouter à un nombre entier
ou un à virgule flottante pour obtenir un nombre complexe avec une partie réelle et
une partie imaginaire.
Python fully supports mixed arithmetic: when a binary arithmetic operator has
operands of different numeric types, the operand with the "narrower" type is widened
to that of the other, where integer is narrower than floating point, which is narrower
than complex. A comparison between numbers of different types behaves as though
the exact values of those numbers were being compared. 2
All numeric types (except complex) support the following operations (for priorities of
the operations, see Priorités des opérateurs):
Note Documentation
Opération Résultat
s complète
-x négatif de x
+x x inchangé
Notes :
Voir http://www.unicode.org/Public/10.0.0/ucd/extracted/DerivedNumericType.txt pou
r une liste complète des caractères avec la propriété Nd.
Opération Résultat
math.trunc(x) x tronqué à l'Integral
Les priorités de toutes les opération à deux opérandes sur des bits sont inférieures
aux opérations numériques et plus élevées que les comparaisons ; l'opération
unaire ~ a la même priorité que les autres opérations numériques unaires ( + et -).
Opératio
Résultat Notes
n
x | y ou <or> binaire de x et y (4)
ou <or> exclusive binaire
x ^ y (4)
de x et y
x & y et binaire <and> de x et y (4)
Opératio
Résultat Notes
n
x << n x décalé vers la gauche de n bits (1)(2)
x >> n x décalé vers la droite de n bits (1)(3)
Notes :
int.bit_length()
>>>
>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6
def bit_length(self):
s = bin(self) # binary representation: bin(-37) --> '-
0b100101'
s = s.lstrip('-0b') # remove leading zeros and minus sign
return len(s) # len('100101') --> 6
int.to_bytes(length, byteorder, *, signed=False)
classmethod int.from_bytes(bytes, byteorder, *, signed=False)
float.as_integer_ratio()
Renvoie une paire de nombres entiers dont le rapport est exactement égal au
nombre d'origine et avec un dénominateur positif. Lève OverflowError avec un
infini et ValueError avec un NaN.
float.is_integer()
>>>
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
float.hex()
Donne une représentation d'un nombre à virgule flottante sous forme de chaîne
hexadécimale. Pour les nombres à virgule flottante finis, cette représentation
comprendra toujours un préfixe 0x, un suffixe p, et un exposant.
classmethod float.fromhex(s)
Notez que l'exposant est écrit en décimal plutôt qu'en hexadécimal, et qu'il donne la
puissance de 2 par lequel multiplier le coefficient. Par exemple, la chaîne
hexadécimale 0x3.a7p10 représente le nombre à virgule
flottante (3 + 10./16 + 7./16**2) *2.0**10, ou 3740.0 :
>>>
>>> float.fromhex('0x3.a7p10')
3740.0
>>>
>>> float.hex(3740.0)
'0x1.d380000000000p+11'
Afin de clarifier les règles ci-dessus, voici quelques exemples de code Python,
équivalent à la fonction de hachage native, pour calculer le hachage d'un nombre
rationnel, d'un float, ou d'un complex :
"""
P = sys.hash_info.modulus
# Remove common factors of P. (Unnecessary if m and n
already coprime.)
while m % P == n % P == 0:
m, n = m // P, n // P
if n % P == 0:
hash_value = sys.hash_info.inf
else:
# Fermat's Little Theorem: pow(n, P-1, P) is 1, so
# pow(n, P-2, P) gives the inverse of n modulo P.
hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
if m < 0:
hash_value = -hash_value
if hash_value == -1:
hash_value = -2
return hash_value
def hash_float(x):
"""Compute the hash of a float x."""
if math.isnan(x):
return sys.hash_info.nan
elif math.isinf(x):
return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
else:
return hash_fraction(*x.as_integer_ratio())
def hash_complex(z):
"""Compute the hash of a complex number z."""
Une méthode doit être définie afin que les objets conteneurs supportent l'itération :
container.__iter__()
Donne un objet itérateur. L'objet doit implémenter le protocole d'itération décrit ci-
dessous. Si un conteneur prend en charge différents types d'itération, d'autres
méthodes peuvent être fournies pour obtenir spécifiquement les itérateurs pour ces
types d'itération. (Exemple d'un objet supportant plusieurs formes d'itération : une
structure d'arbre pouvant être parcourue en largeur ou en profondeur.) Cette
méthode correspond à l'attribut tp_iter de la structure du type des objets Python
dans l'API Python/C.
Les itérateurs eux-mêmes doivent implémenter les deux méthodes suivantes, qui
forment ensemble le protocole d'itérateur <iterator protocol> :
iterator.__iter__()
Donne l'objet itérateur lui-même. Cela est nécessaire pour permettre à la fois à des
conteneurs et des itérateurs d'être utilisés avec les instructions for et in. Cette
méthode correspond à l'attribut tp_iter de la structure des types des objets Python
dans l'API Python/C.
iterator.__next__()
Donne l'élément suivant du conteneur. S'il n'y a pas d'autres éléments, une
exception StopIteration est levée. Cette méthode correspond à
l'attribut PyTypeObject.tp_iternext de la structure du type des objets Python
dans l'API Python/C.
Python définit plusieurs objets itérateurs pour itérer sur les types standards ou
spécifiques de séquence, de dictionnaires et d'autres formes plus spécialisées. Les
types spécifiques ne sont pas importants au-delà de leur implémentation du
protocole d'itération.
Types générateurs
Les generators offrent un moyen pratique d'implémenter le protocole d'itération. Si la
méthode __iter__() d'un objet conteneur est implémentée comme un générateur,
elle renverra automatiquement un objet iterator (techniquement, un objet générateur)
fournissant les méthodes __iter__() et __next__(). Plus d'informations sur les
générateurs peuvent être trouvés dans la documentation de l'expression yield.
Ce tableau répertorie les opérations sur les séquences triées par priorité ascendante.
Dans le tableau, s, et t sont des séquences du même type, n, i, j et k sont des
nombres entiers et x est un objet arbitraire qui répond à toutes les restrictions de
type et de valeur imposée par s.
Les opérations in et not in ont les mêmes priorités que les opérations de
comparaison. Les opérations + (concaténation) et * (répétition) ont la même priorité
que les opérations numériques correspondantes. 3
Notes :
>>>
>>> "gg" in "eggs"
True
2. Les valeurs de n plus petites que 0 sont traitées comme 0 (ce qui donne une
séquence vide du même type que s). Notez que les éléments de s ne sont pas
copiés ; ils sont référencés plusieurs fois. Cela hante souvent de nouveaux
développeurs Python, typiquement :
>>>
Ce qui est arrivé est que [[]] est une liste à un élément contenant une liste vide, de
sorte que les trois éléments de [[]] * 3 sont des références à cette seule liste
vide. Modifier l'un des éléments de lists modifie cette liste unique. Vous pouvez
créer une liste des différentes listes de cette façon :
>>>
Notes :
Listes
Les listes sont des séquences muables, généralement utilisées pour stocker des
collections d'éléments homogènes (où le degré de similitude variera selon l'usage).
class list([iterable])
En utilisant une paire de crochets pour indiquer une liste vide : []
Au moyen de crochets, séparant les éléments par des
virgules : [a], [a, b, c]
En utilisant une liste en compréhension : [x for x in iterable]
En utilisant le constructeur du type : list() ou list(iterable)
Le constructeur crée une liste dont les éléments sont les mêmes et dans le même
ordre que les éléments d'iterable. iterable peut être soit une séquence, un conteneur
qui supporte l'itération, soit un itérateur. Si iterable est déjà une liste, une copie est
faite et renvoyée, comme avec iterable[:]. Par
exemple, list('abc') renvoie ['a', 'b', 'c'] et list( (1, 2, 3) ) renvoi
e [1, 2, 3]. Si aucun argument est donné, le constructeur crée une nouvelle liste
vide, [].
sort(*, key=None, reverse=False)
Cette méthode trie la liste sur place, en utilisant uniquement des
comparaisons < entre les éléments. Les exceptions ne sont pas supprimées si
n'importe quelle opération de comparaison échoue, le tri échouera (et la liste sera
probablement laissée dans un état partiellement modifié).
sort() accepte deux arguments qui ne peuvent être fournis que par mot-clé
(keyword-only arguments):
key spécifie une fonction d'un argument utilisée pour extraire une clé de comparaison
de chaque élément de la liste (par exemple, key=str.lower). La clé correspondant
à chaque élément de la liste n'est calculée qu'une seule fois, puis utilisée durant tout
le processus. La valeur par défaut, None, signifie que les éléments sont triés
directement sans en calculer une valeur "clé" séparée.
reverse, une valeur booléenne. Si elle est True, la liste d'éléments est triée comme
si toutes les comparaisons étaient inversées.
Cette méthode modifie la séquence sur place pour économiser de l'espace lors du tri
de grandes séquences. Pour rappeler aux utilisateurs cet effet de bord, elle ne
renvoie pas la séquence triée (utilisez sorted() pour demander explicitement une
nouvelle instance de liste triée).
Tuples
Les tuples (n-uplets en français) sont des séquences immuables, généralement
utilisées pour stocker des collections de données hétérogènes (tels que les tuples de
deux éléments produits par la fonction native enumerate()). Les tuples sont
également utilisés dans des cas où une séquence homogène et immuable de
données est nécessaire (pour, par exemple, les stocker dans un set ou un dict).
class tuple([iterable])
Le constructeur construit un tuple dont les éléments sont les mêmes et dans le
même ordre que les éléments de iterable. iterable peut être soit une séquence, un
conteneur qui supporte l'itération, soit un itérateur. Si iterable est déjà un tuple, il est
renvoyé inchangé. Par
exemple, tuple('abc') renvoie ('a', 'b', 'c') et tuple( [1, 2, 3] ) renv
oie (1, 2, 3). Si aucun argument est donné, le constructeur crée un nouveau tuple
vide, ().
Notez que c'est en fait la virgule qui fait un tuple et non les parenthèses. Les
parenthèses sont facultatives, sauf dans le cas du tuple vide, ou lorsqu'elles sont
nécessaires pour éviter l'ambiguïté syntaxique. Par exemple, f(a, b, c) est un
appel de fonction avec trois arguments, alors que f((a, b, c)) est un appel de
fonction avec un tuple de trois éléments comme unique argument.
Pour les collections hétérogènes de données où l'accès par nom est plus clair que
l'accès par index, collections.namedtuple() peut être un choix plus approprié
qu'un simple tuple.
Ranges
Le type range représente une séquence immuable de nombres et est couramment
utilisé pour itérer un certain nombre de fois dans les boucles for.
class range(stop)
class range(start, stop[, step])
Exemples avec range :
>>>
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]
start
La valeur du paramètre start (ou 0 si le paramètre n'a pas été fourni)
stop
La valeur du paramètre stop
step
La valeur du paramètre step (ou 1 si le paramètre n'a pas été fourni)
Voir aussi
La recette linspace montre comment implémenter une version paresseuse
de range adaptée aux nombres à virgule flottante.
Les chaînes entre triple guillemets peuvent couvrir plusieurs lignes, tous les espaces
associés seront inclus dans la chaîne littérale.
Les chaînes littérales qui font partie d'une seule expression et ont seulement des
espaces entre elles sont implicitement converties en une seule chaîne littérale.
Autrement dit, ("spam " "eggs") == "spam eggs".
Les chaînes peuvent également être créés à partir d'autres objets à l'aide du
constructeur str.
Comme il n'y a pas de type "caractère" distinct, l'indexation d'une chaîne produit des
chaînes de longueur 1. Autrement dit, pour une chaîne non
vide s, s[0] == s[0:1].
Modifié dans la version 3.3: Pour une compatibilité ascendante avec la série Python
2, le préfixe u est à nouveau autorisé sur les chaînes littérales. Elle n'a aucun effet
sur le sens des chaînes littérales et ne peut être combiné avec le préfixe r.
class str(object='')
class str(object=b'', encoding='utf-8', errors='strict')
>>>
>>> str(b'Zoot!')
"b'Zoot!'"
Pour plus d'informations sur la classe str et ses méthodes, voir les sections Type
Séquence de Texte — str et Méthodes de chaînes de caractères. Pour formater des
chaînes de caractères, voir les sections Chaînes de caractères formatées
littérales et Syntaxe de formatage de chaîne. La section Services de Manipulation de
Texte contient aussi des informations.
Les chaînes gèrent aussi deux styles de mise en forme, l'un fournissant une grande
flexibilité et de personnalisation (voir str.format(), Syntaxe de formatage de
chaîne et Formatage personnalisé de chaîne) et l'autre basée sur printf du C qui
gère une gamme plus étroite des types et est légèrement plus difficile à utiliser
correctement, mais il est souvent plus rapide pour les cas, il peut gérer (Formatage
de chaines à la printf).
str.capitalize()
Renvoie une copie de la chaîne avec son premier caractère en majuscule et le reste
en minuscule.
str.casefold()
str.count(sub[, start[, end]])
str.encode(encoding="utf-8", errors="strict")
Donne une version encodée de la chaîne sous la forme d'un objet bytes. L'encodage
par défaut est 'utf-8'. errors peut être donné pour choisir un autre système de
gestion d'erreur. La valeur par défaut pour errors est 'strict', ce qui signifie que
les erreurs d'encodage lèvent une UnicodeError. Les autres valeurs possibles
sont 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' et
tout autre nom enregistré via codecs.register_error(), voir la
section Gestionnaires d'erreurs. Pour une liste des encodages possibles, voir la
section Standard Encodings.
str.endswith(suffix[, start[, end]])
str.expandtabs(tabsize=8)
Donne une copie de la chaîne où toutes les tabulations sont remplacées par un ou
plusieurs espaces, en fonction de la colonne courante et de la taille de tabulation
donnée. Les positions des tabulations se trouvent tous les tabsize caractères (8 par
défaut, ce qui donne les positions de tabulations aux colonnes 0, 8, 16 et ainsi de
suite). Pour travailler sur la chaîne, la colonne en cours est mise à zéro et la chaîne
est examinée caractère par caractère. Si le caractère est une tabulation ( \t), un ou
plusieurs caractères d'espacement sont insérés dans le résultat jusqu'à ce que la
colonne courante soit égale à la position de tabulation suivante. (Le caractère
tabulation lui-même n'est pas copié.) Si le caractère est un saut de ligne ( \n) ou un
retour chariot (\r), il est copié et la colonne en cours est remise à zéro. Tout autre
caractère est copié inchangé et la colonne en cours est incrémentée de un
indépendamment de la façon dont le caractère est représenté lors de l'affichage.
>>> '01\t012\t0123\t01234'.expandtabs()
'01 012 0123 01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01 012 0123 01234'
str.find(sub[, start[, end]])
Note
str.format(*args, **kwargs)
Formate une chaîne. La chaîne sur laquelle cette méthode est appelée peut contenir
du texte littéral ou des emplacements de remplacement délimités par des
accolades {}. Chaque champ de remplacement contient soit l'indice numérique d'un
argument positionnel, ou le nom d'un argument donné par mot-clé. Renvoie une
copie de la chaîne où chaque champ de remplacement est remplacé par la valeur de
chaîne de l'argument correspondant.
Note
Lors du formatage avec le format n (comme '{:n}'.format(1234)) d'un nombre
(int, float, complex, decimal.Decimal et dérivées), la fonction met temporairement
la variable LC_CTYPE à la valeur de LC_NUMERIC pour décoder correctement les
attributs decimal_point et thousands_sep de localeconv(), s'ils ne sont pas en
ASCII ou font plus d'un octet, et que LC_NUMERIC est différent de LC_CTYPE. Ce
changement temporaire affecte les autres fils d'exécution.
str.format_map(mapping)
str.index(sub[, start[, end]])
str.isalnum()
Return True if all characters in the string are alphanumeric and there is at least one
character, False otherwise. A character c is alphanumeric if one of the following
returns True: c.isalpha(), c.isdecimal(), c.isdigit(), or c.isnumeric().
str.isalpha()
Return True if all characters in the string are alphabetic and there is at least one
character, False otherwise. Alphabetic characters are those characters defined in
the Unicode character database as "Letter", i.e., those with general category property
being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is different from the
"Alphabetic" property defined in the Unicode Standard.
str.isascii()
Return True if the string is empty or all characters in the string are
ASCII, False otherwise. ASCII characters have code points in the range U+0000-
U+007F.
str.isdecimal()
Return True if all characters in the string are decimal characters and there is at least
one character, False otherwise. Decimal characters are those that can be used to
form numbers in base 10, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a
decimal character is a character in the Unicode General Category "Nd".
str.isdigit()
Return True if all characters in the string are digits and there is at least one
character, False otherwise. Digits include decimal characters and digits that need
special handling, such as the compatibility superscript digits. This covers digits which
cannot be used to form numbers in base 10, like the Kharosthi numbers. Formally, a
digit is a character that has the property value Numeric_Type=Digit or
Numeric_Type=Decimal.
str.isidentifier()
str.islower()
Return True if all cased characters 4 in the string are lowercase and there is at least
one cased character, False otherwise.
str.isnumeric()
Return True if all characters in the string are numeric characters, and there is at
least one character, False otherwise. Numeric characters include digit characters,
and all characters that have the Unicode numeric value property, e.g. U+2155,
VULGAR FRACTION ONE FIFTH. Formally, numeric characters are those with the
property value Numeric_Type=Digit, Numeric_Type=Decimal or
Numeric_Type=Numeric.
str.isprintable()
Return True if all characters in the string are printable or the string is
empty, False otherwise. Nonprintable characters are those characters defined in the
Unicode character database as "Other" or "Separator", excepting the ASCII space
(0x20) which is considered printable. (Note that printable characters in this context
are those which should not be escaped when repr() is invoked on a string. It has
no bearing on the handling of strings written to sys.stdout or sys.stderr.)
str.isspace()
Return True if there are only whitespace characters in the string and there is at least
one character, False otherwise.
str.istitle()
Return True if the string is a titlecased string and there is at least one character, for
example uppercase characters may only follow uncased characters and lowercase
characters only cased ones. Return False otherwise.
str.isupper()
Return True if all cased characters 4 in the string are uppercase and there is at least
one cased character, False otherwise.
str.join(iterable)
Donne une chaîne qui est la concaténation des chaînes contenues dans iterable.
Une TypeError sera levée si une valeur d'iterable n'est pas une chaîne, y compris
pour les objets bytes. Le séparateur entre les éléments est la chaîne fournissant
cette méthode.
str.ljust(width[, fillchar])
str.lower()
str.lstrip([chars])
>>>
Si un seul argument est fourni, ce soit être un dictionnaire faisant correspondre des
points de code Unicode (nombres entiers) ou des caractères (chaînes de longueur 1)
à des points de code Unicode.
Si deux arguments sont fournis, ce doit être deux chaînes de caractères de même
longueur. Le dictionnaire renvoyé fera correspondre pour chaque caractère de x un
caractère de y pris à la même place. Si un troisième argument est fourni, ce doit être
une chaîne dont chaque caractère correspondra à None dans le résultat.
str.partition(sep)
str.replace(old, new[, count])
str.rindex(sub[, start[, end]])
str.rjust(width[, fillchar])
str.rpartition(sep)
str.rsplit(sep=None, maxsplit=-1)
str.rstrip([chars])
>>>
Par exemple :
>>>
>>> '1,2,3'.split(',')
['1', '2', '3']
>>> '1,2,3'.split(',', maxsplit=1)
['1', '2,3']
>>> '1,2,,3,'.split(',')
['1', '2', '', '3', '']
Par exemple :
>>>
Renvoie les lignes de la chaîne sous forme de liste, la découpe se fait au niveau des
limites des lignes. Les sauts de ligne ne sont pas inclus dans la liste des résultats,
sauf si keepends est donné, et est vrai.
Cette méthode découpe sur les limites de ligne suivantes. Ces limites sont un sur
ensemble de universal newlines.
Représentatio
Description
n
\n Saut de ligne
\r Retour chariot
\r\n Retour chariot + saut de ligne
\v or \x0b Tabulation verticale
\f or \x0c Saut de page
\x1c Séparateur de fichiers
\x1d Séparateur de groupes
\x1e Séparateur d'enregistrements
\x85 Ligne suivante (code de contrôle C1)
\u2028 Séparateur de ligne
\u2029 Séparateur de paragraphe
Par exemple :
>>>
>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']
À titre de comparaison, split('\n') donne :
>>>
>>> ''.split('\n')
['']
>>> 'Two lines\n'.split('\n')
['Two lines', '']
str.startswith(prefix[, start[, end]])
str.strip([chars])
Donne une copie de la chaîne dont des caractères initiaux et finaux sont supprimés.
L'argument chars est une chaîne spécifiant le jeu de caractères à supprimer. En cas
d'omission ou None, les espaces sont supprimés. L'argument chars est pas un
préfixe ni un suffixe, toutes les combinaisons de ses valeurs sont supprimées :
>>>
>>>
Renvoie une copie de la chaîne dont les caractères majuscules sont convertis en
minuscules et vice versa. Notez qu'il est pas nécessairement vrai
que s.swapcase().swapcase() == s.
str.title()
Par exemple :
>>>
>>>
Une solution pour contourner le problème des apostrophes peut être obtenue en
utilisant des expressions rationnelles :
>>>
>>> import re
>>> def titlecase(s):
... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
... lambda mo: mo.group(0)[0].upper() +
... mo.group(0)[1:].lower(),
... s)
...
>>> titlecase("they're bill's friends.")
"They're Bill's Friends."
str.translate(table)
Renvoie une copie de la chaîne dans laquelle chaque caractère a été changé selon
la table de traduction donnée. La table doit être un objet qui implémente l'indexation
via __getitem__(), typiquement un mapping ou une sequence. Pour un ordinal
Unicode (un entier), la table peut donner soit un ordinal Unicode ou une chaîne pour
faire correspondre un ou plusieurs caractère au caractère donné, soit None pour
supprimer le caractère de la chaîne de renvoyée soit lever une
exception LookupError pour ne pas changer le caractère.
str.upper()
str.zfill(width)
Renvoie une copie de la chaîne remplie par la gauche du chiffre (le caractère
ASCII) '0' pour faire une chaîne de longueur width. Un préfixe ('+' / '-') est
permis par l'insertion du caractère de rembourrage après le caractère désigne plutôt
qu'avant. La chaîne d'origine est renvoyée si width est inférieur ou égale à len(s).
Par exemple :
>>>
>>> "42".zfill(5)
'00042'
>>> "-42".zfill(5)
'-0042'
Lorsque l'argument de droite est un dictionnaire (ou un autre type de mapping), les
marqueurs dans la chaîne doivent inclure une clé présente dans le dictionnaire,
écrite entre parenthèses, immédiatement après le caractère '%'. La clé indique
quelle valeur du dictionnaire doit être formatée. Par exemple :
>>> print('%(language)s has %(number)03d quote types.' %
... {'language': "Python", "number": 2})
Python has 002 quote types.
Puisque les chaînes Python ont une longueur explicite, les conversions %s ne
considèrent pas '\0' comme la fin de la chaîne.
Séquences Binaires
--- bytes, bytearray, memoryview
Les principaux types natifs pour manipuler des données binaires
sont bytes et bytearray. Ils sont supportés par memoryview qui utilise le buffer
protocol pour accéder à la mémoire d'autres objets binaires sans avoir besoin d'en
faire une copie.
Le module array permet le stockage efficace de types basiques comme les entiers
de 32 bits et les float double précision IEEE754.
Objets bytes
Les bytes sont des séquences immuables d'octets. Comme beaucoup de protocoles
binaires utilisent l'ASCII, les objets bytes offrent plusieurs méthodes qui ne sont
valables que lors de la manipulation de données ASCII et sont étroitement liés aux
objets str dans bien d'autres aspects.
class bytes([source[, encoding[, errors]]])
Tout d'abord, la syntaxe des bytes littéraux est en grande partie la même que pour
les chaînes littérales, en dehors du préfixe b :
Les guillemets
simples : b'autorisent aussi les guillemets "doubles"'
Les guillemets
doubles : b"permettent aussi les guillemets 'simples'".
Les guillemets
triples : b'''3 single quotes''', b"""3 double quotes"""
Seuls les caractères ASCII sont autorisés dans les littéraux de bytes (quel que soit
l'encodage du code source déclaré). Toutes les valeurs au delà de 127 doivent être
entrés dans littéraux de bytes en utilisant une séquence d'échappement appropriée.
Bien que les bytes littéraux, et leurs représentation, soient basés sur du texte ASCII,
les bytes se comportent en fait comme des séquences immuables de nombres
entiers, dont les valeurs sont restreintes dans 0 <= x < 256 (ne pas respecter
cette restriction lève une ValueError. Ceci est fait délibérément afin de souligner
que, bien que de nombreux encodages binaires soient compatibles avec l'ASCII, et
peuvent être manipulés avec des algorithmes orientés texte, ce n'est généralement
pas le cas pour les données binaires arbitraires (appliquer aveuglément des
algorithmes de texte sur des données binaires qui ne sont pas compatibles ASCII
conduit généralement à leur corruption).
En plus des formes littérales, des objets bytes peuvent être créés par de nombreux
moyens :
classmethod fromhex(string)
hex()
Renvoie une chaîne contenant deux chiffres hexadécimaux pour chaque octet
du byte.
>>> b'\xf0\xf1\xf2'.hex()
'f0f1f2'
Note
Pour les utilisateurs de Python 2.x : Dans la série 2.x de Python, une variété de
conversions implicites entre les chaînes 8-bit (la chose la plus proche d'un type natif
de données binaires offert par Python 2) et des chaînes Unicode étaient permises.
C'était une solution de contournement, pour garder la rétro-compatibilité, considérant
que Python ne prenait initialement en charge que le texte 8 bits, le texte Unicode est
un ajout ultérieur. En Python 3.x, ces conversions implicites ont disparues, les
conversions entre les données binaires et texte Unicode doivent être explicites, et
les bytes sont toujours différents des chaînes.
Objets bytearray
Les objets bytearray sont l'équivalent muable des objets bytes.
class bytearray([source[, encoding[, errors]]])
Il n'y a pas de syntaxe littérale dédiée aux bytearray, ils sont toujours créés en
appelant le constructeur :
hex()
Renvoie une chaîne contenant deux chiffres hexadécimaux pour chaque octet
du byte.
>>> bytearray(b'\xf0\xf1\xf2').hex()
'f0f1f2'
et :
a = b"abc"
b = a.replace(b"a", b"f")
Note
Utiliser ces opérations basées sur l'ASCII pour manipuler des données binaires qui
ne sont pas au format ASCII peut les corrompre.
bytes.count(sub[, start[, end]])
bytearray.count(sub[, start[, end]])
Modifié dans la version 3.3: Accepte aussi un nombre entier compris entre 0 et 255
comme sous-séquence.
bytes.decode(encoding="utf-8", errors="strict")
bytearray.decode(encoding="utf-8", errors="strict")
Décode les octets donnés, et le renvoie sous forme d'une chaîne de caractères.
L'encodage par défaut est 'utf-8'. errors peut être donné pour changer de
système de gestion des erreurs. Sa valeur par défaut est 'strict', ce qui signifie
que les erreurs d'encodage lèvent une UnicodeError. Les autres valeurs possibles
sont 'ignore', 'replace' et tout autre nom enregistré
via codecs.register_error(), voir la section Gestionnaires d'erreurs. Pour une
liste des encodages possibles, voir la section Standard Encodings.
Note
bytes.endswith(suffix[, start[, end]])
bytearray.endswith(suffix[, start[, end]])
bytes.find(sub[, start[, end]])
bytearray.find(sub[, start[, end]])
Donne la première position où le sub se trouve dans les données, de telle sorte
que sub soit contenue dans s[start:end]. Les arguments
facultatifs start et end sont interprétés comme dans la notation des slices. Donne -
1 si sub n'est pas trouvé.
Note
La méthode find() ne doit être utilisée que si vous avez besoin de connaître la
position de sub. Pour vérifier si sub est présent ou non, utilisez l'opérateur in :
>>>
Modifié dans la version 3.3: Accepte aussi un nombre entier compris entre 0 et 255
comme sous-séquence.
bytes.index(sub[, start[, end]])
bytearray.index(sub[, start[, end]])
Modifié dans la version 3.3: Accepte aussi un nombre entier compris entre 0 et 255
comme sous-séquence.
bytes.join(iterable)
bytearray.join(iterable)
static bytes.maketrans(from, to)
static bytearray.maketrans(from, to)
bytes.partition(sep)
bytearray.partition(sep)
bytes.replace(old, new[, count])
bytearray.replace(old, new[, count])
Note
bytearray.rfind(sub[, start[, end]])
Modifié dans la version 3.3: Accepte aussi un nombre entier compris entre 0 et 255
comme sous-séquence.
bytes.rindex(sub[, start[, end]])
bytearray.rindex(sub[, start[, end]])
Semblable à rfind() mais lève une ValueError lorsque sub est introuvable.
Modifié dans la version 3.3: Accepte aussi un nombre entier compris entre 0 et 255
comme sous-séquence.
bytes.rpartition(sep)
bytearray.rpartition(sep)
bytes.startswith(prefix[, start[, end]])
bytearray.startswith(prefix[, start[, end]])
bytes.translate(table, delete=b'')
bytearray.translate(table, delete=b'')
>>>
>>> b'read this short text'.translate(None, b'aeiou')
b'rd ths shrt txt'
bytes.center(width[, fillbyte])
bytearray.center(width[, fillbyte])
Note
bytearray.ljust(width[, fillbyte])
Renvoie une copie de l'objet aligné à gauche dans une séquence de longueur width.
Le remplissage est fait en utilisant fillbyte (par défaut un espace ASCII). Pour les
objets bytes, la séquence initiale est renvoyée si width est inférieure ou égale
à len(s).
Note
bytearray.lstrip([chars])
Renvoie une copie de la séquence dont certains préfixes ont été supprimés.
L’argument chars est une séquence binaire spécifiant le jeu d'octets à supprimer. Ce
nom se réfère au fait de cette méthode est généralement utilisée avec des
caractères ASCII. En cas d’omission ou None, la valeur par défaut de chars permet
de supprimer des espaces ASCII. L’argument chars n’est pas un préfixe, toutes les
combinaisons de ses valeurs sont supprimées :
>>>
Note
bytearray.rjust(width[, fillbyte])
Renvoie une copie de l'objet justifié à droite dans une séquence de longueur width.
Le remplissage est fait en utilisant le caractère fillbyte (par défaut est un espace
ASCII). Pour les objets bytes, la séquence d'origine est renvoyée si width est
inférieure ou égale à len(s).
Note
bytearray.rsplit(sep=None, maxsplit=-1)
bytes.rstrip([chars])
bytearray.rstrip([chars])
Renvoie une copie de la séquence dont des octets finaux sont supprimés.
L'argument chars est une séquence d'octets spécifiant le jeu de caractères à
supprimer. En cas d'omission ou None, les espaces ASCII sont supprimés.
L'argument chars n'est pas un suffixe : toutes les combinaisons de ses valeurs sont
retirées :
>>>
Note
bytearray.split(sep=None, maxsplit=-1)
>>>
>>> b'1,2,3'.split(b',')
[b'1', b'2', b'3']
>>> b'1,2,3'.split(b',', maxsplit=1)
[b'1', b'2,3']
>>> b'1,2,,3,'.split(b',')
[b'1', b'2', b'', b'3', b'']
Par exemple :
>>>
bytearray.strip([chars])
Renvoie une copie de la séquence dont des caractères initiaux et finaux sont
supprimés. L'argument chars est une séquence spécifiant le jeu d'octets à supprimer,
le nom se réfère au fait de cette méthode est généralement utilisée avec des
caractères ASCII. En cas d'omission ou None, les espaces ASCII sont supprimés.
L'argument chars n'est ni un préfixe ni un suffixe, toutes les combinaisons de ses
valeurs sont supprimées :
>>>
bytes.capitalize()
bytearray.capitalize()
Renvoie une copie de la séquence dont chaque octet est interprété comme un
caractère ASCII, le premier octet en capitale et le reste en minuscules. Les octets
non ASCII ne sont pas modifiés.
Note
bytearray.expandtabs(tabsize=8)
Renvoie une copie de la séquence où toutes les tabulations ASCII sont remplacées
par un ou plusieurs espaces ASCII, en fonction de la colonne courante et de la taille
de tabulation donnée. Les positions des tabulations se trouvent tous
les tabsize caractères (8 par défaut, ce qui donne les positions de tabulations aux
colonnes 0, 8, 16 et ainsi de suite). Pour travailler sur la séquence, la colonne en
cours est mise à zéro et la séquence est examinée octets par octets. Si l'octet est
une tabulation ASCII (b' '), un ou plusieurs espaces sont insérés au résultat
jusqu’à ce que la colonne courante soit égale à la position de tabulation suivante. (Le
caractère tabulation lui-même n’est pas copié.) Si l'octet courant est un saut de ligne
ASCII (b' ') ou un retour chariot (b'\r'), il est copié et la colonne en cours est
remise à zéro. Tout autre octet est copié inchangé et la colonne en cours est
incrémentée de un indépendamment de la façon dont l'octet est représenté lors de
l’affichage :
>>>
>>> b'01\t012\t0123\t01234'.expandtabs()
b'01 012 0123 01234'
>>> b'01\t012\t0123\t01234'.expandtabs(4)
b'01 012 0123 01234'
Note
bytearray.isalnum()
Return True if all bytes in the sequence are alphabetical ASCII characters or ASCII
decimal digits and the sequence is not empty, False otherwise. Alphabetic ASCII
characters are those byte values in the
sequence b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.
ASCII decimal digits are those byte values in the sequence b'0123456789'.
Par exemple :
>>>
>>> b'ABCabc1'.isalnum()
True
>>> b'ABC abc1'.isalnum()
False
bytes.isalpha()
bytearray.isalpha()
Return True if all bytes in the sequence are alphabetic ASCII characters and the
sequence is not empty, False otherwise. Alphabetic ASCII characters are those byte
values in the
sequence b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.
Par exemple :
>>>
>>> b'ABCabc'.isalpha()
True
>>> b'ABCabc1'.isalpha()
False
bytes.isascii()
bytearray.isascii()
bytes.isdigit()
bytearray.isdigit()
Return True if all bytes in the sequence are ASCII decimal digits and the sequence
is not empty, False otherwise. ASCII decimal digits are those byte values in the
sequence b'0123456789'.
Par exemple :
>>>
>>> b'1234'.isdigit()
True
>>> b'1.23'.isdigit()
False
bytes.islower()
bytearray.islower()
Return True if there is at least one lowercase ASCII character in the sequence and
no uppercase ASCII characters, False otherwise.
Par exemple :
>>>
bytes.isspace()
bytearray.isspace()
Return True if all bytes in the sequence are ASCII whitespace and the sequence is
not empty, False otherwise. ASCII whitespace characters are those byte values in
the sequence b' \t\n\r\x0b\f' (space, tab, newline, carriage return, vertical tab,
form feed).
bytes.istitle()
bytearray.istitle()
Par exemple :
>>>
bytearray.isupper()
Par exemple :
>>>
bytes.lower()
bytearray.lower()
Renvoie une copie de la séquence dont tous les caractères ASCII en majuscules
sont convertis en leur équivalent en minuscules.
Par exemple :
>>>
Note
bytearray.splitlines(keepends=False)
Renvoie une liste des lignes de la séquence d'octets, découpant au niveau des fin de
lignes ASCII. Cette méthode utilise l'approche universal newlines pour découper les
lignes. Les fins de ligne ne sont pas inclus dans la liste des résultats, sauf
si keepends est donné et vrai.
Par exemple :
>>>
>>>
Renvoie une copie de la séquence dont tous les caractères ASCII minuscules sont
convertis en majuscules et vice-versa.
Par exemple :
>>>
Contrairement à str.swapcase(), bin.swapcase().swapcase() == bin est
toujours vrai. Les conversions majuscule/minuscule en ASCII étant toujours
symétrique, ce qui n'est pas toujours vrai avec Unicode.
Note
bytearray.title()
Par exemple :
>>>
>>>
Une solution pour contourner le problème des apostrophes peut être obtenue en
utilisant des expressions rationnelles :
>>>
>>> import re
>>> def titlecase(s):
... return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?",
... lambda mo: mo.group(0)[0:1].upper() +
... mo.group(0)[1:].lower(),
... s)
...
>>> titlecase(b"they're bill's friends.")
b"They're Bill's Friends."
Note
bytearray.upper()
Renvoie une copie de la séquence dont tous les caractères ASCII minuscules sont
convertis en leur équivalent majuscule.
Par exemple :
>>>
bytearray.zfill(width)
Par exemple :
>>>
>>> b"42".zfill(5)
b'00042'
>>> b"-42".zfill(5)
b'-0042'
Note
Les opérations de formatage décrites ici présentent une variété de bizarreries qui
conduisent à un certain nombre d’erreurs classiques (typiquement, échouer à
afficher des tuples ou des dictionnaires correctement). Si la valeur à afficher peut
être un tuple ou un dictionnaire, mettez le a l'intérieur d'un autre tuple.
Lorsque l'argument de droite est un dictionnaire (ou un autre type de mapping), les
marqueurs dans le bytes doivent inclure une clé présente dans le dictionnaire, écrite
entre parenthèses, immédiatement après le caractère '%'. La clé indique quelle
valeur du dictionnaire doit être formatée. Par exemple :
Vues de mémoires
Les memoryview permettent a du code Python d'accéder sans copie aux données
internes d'un objet prenant en charge le buffer protocol.
class memoryview(obj)
>>>
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
>>>
>>>
>>>
>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
True
>>> hash(v[2:4]) == hash(b'ce')
True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
True
__eq__(exporter)
Une memoryview et un exporter de la PEP 3118 sont égaux si leurs formes sont
équivalentes et si toutes les valeurs correspondantes sont égales, le format
respectifs des opérandes étant interprétés en utilisant la syntaxe de struct.
>>>
Si l'un des format n'est pas supporté par le module de struct, les objets seront
toujours considérés différents (même si les formats et les valeurs contenues sont
identiques) :
>>>
tobytes()
Renvoie les données du buffer sous forme de bytes. Cela équivaut à appeler le
constructeur bytes sur le memoryview.
>>>
>>> m = memoryview(b"abc")
>>> m.tobytes()
b'abc'
>>> bytes(m)
b'abc'
Pour les listes non contiguës le résultat est égal à la représentation en liste aplatie
dont tous les éléments sont convertis en octets. tobytes() supporte toutes les
chaînes de format, y compris celles qui ne sont pas connues du module struct.
hex()
Renvoie une chaîne contenant deux chiffres hexadécimaux pour chaque octet de la
mémoire.
>>>
>>> m = memoryview(b"abc")
>>> m.hex()
'616263'
tolist()
Renvoie les données de la mémoire sous la forme d'une liste d'éléments.
>>>
>>> memoryview(b'abc').tolist()
[97, 98, 99]
>>> import array
>>> a = array.array('d', [1.1, 2.2, 3.3])
>>> m = memoryview(a)
>>> m.tolist()
[1.1, 2.2, 3.3]
Modifié dans la version 3.3: tolist() prend désormais en charge tous les formats
d'un caractère du module struct ainsi que des représentations
multidimensionnelles.
release()
Libère le tampon sous-jacent exposé par l'objet memoryview. Beaucoup d'objets
prennent des initiatives particulières lorsqu'ils sont liés à une vue (par exemple,
un bytearray refusera temporairement de se faire redimensionner). Par
conséquent, appeler release() peut être pratique pour lever ces restrictions (et en
libérer les ressources liées) aussi tôt que possible.
Après le premier appel de cette méthode, toute nouvelle opération sur la view lève
une ValueError (sauf release() elle-même qui peut être appelée plusieurs fois) :
>>>
>>> m = memoryview(b'abc')
>>> m.release()
>>> m[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object
Le protocole de gestion de contexte peut être utilisé pour obtenir un effet similaire,
via l'instruction with :
>>>
cast(format[, shape])
Change le format ou la forme d'une memoryview. Par
défaut shape vaut [byte_length//new_itemsize], ce qui signifie que la vue
résultante n'aura qu'une dimension. La valeur renvoyée est une
nouvelle memoryview, mais la mémoire elle-même n'est pas copiée. Les
changements supportés sont une dimension vers C-contiguous et C-contiguous vers
une dimension.
Transforme 1D/long en 1D/unsigned bytes :
>>>
Transforme 1D/unsigned bytes en 1D/char :
>>>
>>> b = bytearray(b'zyz')
>>> x = memoryview(b)
>>> x[0] = b'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: memoryview: invalid value for format "B"
>>> y = x.cast('c')
>>> y[0] = b'a'
>>> b
bytearray(b'ayz')
Transforme 1D/bytes en 3D/ints en 1D/signed char :
>>>
>>>
Modifié dans la version 3.5: Le format de la source n'est plus restreint lors de la
transformation vers une vue d'octets.
obj
L'objet sous-jacent de la memoryview :
>>>
>>> b = bytearray(b'xyz')
>>> m = memoryview(b)
>>> m.obj is b
True
nbytes
nbytes == product(shape) * itemsize == len(m.tobytes()). Ceci est
l'espace que la liste utiliserait en octets, dans une représentation contiguë. Ce n'est
pas nécessairement égale à len(m) :
>>>
>>>
readonly
Un booléen indiquant si la mémoire est en lecture seule.
format
Une chaîne contenant le format (dans le style de struct) pour chaque élément de la
vue. Une memoryview peut être crée depuis des exportateurs de formats arbitraires,
mais certaines méthodes (comme tolist()) sont limitées aux formats natifs à un
seul élément.
itemsize
La taille en octets de chaque élément d'une memoryview :
>>>
shape
Un tuple d'entiers de longueur ndim donnant la forme de la memoryview sous forme
d'un tableau à N dimensions.
strides
Un tuple d'entiers de longueur ndim donnant la taille en octets permettant d'accéder
à chaque dimensions du tableau.
suboffsets
Détail de l'implémentation des PIL-style arrays. La valeur n'est donné qu'a titre
d'information.
c_contiguous
Un booléen indiquant si la mémoire est C-contiguous.
f_contiguous
Un booléen indiquant si la mémoire est Fortran contiguous.
contiguous
Un booléen indiquant si la mémoire est contiguous.
Des sets (mais pas des frozensets) peuvent être crées par une liste d'éléments
séparés par des virgules et entre accolades, par exemple : {'jack', 'sjoerd'},
en plus du constructeur de la classe set.
class set([iterable])
class frozenset([iterable])
len(s)
Donne le nombre d'éléments dans le set s (cardinalité de s).
x in s
Test d'appartenance de x dans s.
x not in s
Test de non-appartenance de x dans s.
isdisjoint(other)
Renvoie True si l'ensemble n'a aucun élément en commun avec other. Les
ensembles sont disjoints si et seulement si leurs intersection est un ensemble vide.
issubset(other)
set <= other
Teste si tous les éléments du set sont dans other.
issuperset(other)
set >= other
Teste si tous les éléments de other sont dans l'ensemble.
union(*others)
set | other | ...
Renvoie un nouvel ensemble dont les éléments viennent de l'ensemble et de tous les
autres.
intersection(*others)
set & other & ...
Renvoie un nouvel ensemble dont les éléments sont commun à l'ensemble et à tous
les autres.
difference(*others)
set - other - ...
Renvoie un nouvel ensemble dont les éléments sont dans l'ensemble mais ne sont
dans aucun des autres.
symmetric_difference(other)
set ^ other
Renvoie un nouvel ensemble dont les éléments sont soit dans l'ensemble, soit dans
les autres, mais pas dans les deux.
copy()
Renvoie une copie de surface du dictionnaire.
Puisque les sets ne définissent qu'un ordre partiel (par leurs relations de sous-
ensembles), la sortie de la méthode list.sort() n'est pas définie pour des listes
d'ensembles.
update(*others)
set |= other | ...
Met à jour l'ensemble, ajoutant les éléments de tous les autres.
intersection_update(*others)
set &= other & ...
Met à jour l'ensemble, ne gardant que les éléments trouvés dans tous les autres.
difference_update(*others)
set -= other | ...
Met à jour l'ensemble, retirant les éléments trouvés dans les autres.
symmetric_difference_update(other)
set ^= other
Met à jour le set, ne gardant que les éléments trouvés dans un des ensembles mais
pas dans les deux.
add(elem)
Ajoute l'élément elem au set.
remove(elem)
Retire l'élément elem de l'ensemble. Lève une exception KeyError si elem n'est pas
dans l'ensemble.
discard(elem)
Retire l'élément elem de l'ensemble s'il y est.
pop()
Retire et renvoie un élément arbitraire de l'ensemble. Lève une
exception KeyError si l'ensemble est vide.
clear()
Supprime tous les éléments du set.
Notez que les versions non-opérateurs des
méthodes update(), intersection_update(), difference_update(),
et symmetric_difference_update() acceptent n'importe quel itérable comme
argument.
Les clefs d'un dictionnaire sont presque des données arbitraires. Les valeurs qui ne
sont pas hashable, c'est-à-dire qui contiennent les listes, des dictionnaires ou autre
type muable (qui sont comparés par valeur plutôt que par leur identité) ne peuvent
pas être utilisées comme clef de dictionnaire. Les types numériques utilisés comme
clef obéissent aux règles classiques en ce qui concerne les comparaisons : si deux
nombres sont égaux (comme 1 et 1.0) ils peuvent tous les deux être utilisés pour
obtenir la même entrée d'un dictionnaire. (Notez cependant que puisque les
ordinateurs stockent les nombres à virgule flottante sous forme d'approximations, il
est généralement imprudent de les utiliser comme clefs de dictionnaires.)
Il est possible de créer des dictionnaires en plaçant entre accolades une liste de
paires de key: value séparés par des virgules, par
exemple: {'jack': 4098, 'sjoerd': 4127} ou {4098: 'jack', 4127: 'sjo
erd'}, ou en utilisant le constructeur de dict.
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)
Si des arguments nommés sont donnés, ils sont ajoutés au dictionnaire créé depuis
l'argument positionnel. Si une clef est déjà présente, la valeur de l'argument nommé
remplace la valeur reçue par l'argument positionnel.
>>>
Fournir les arguments nommés comme dans le premier exemple en fonctionne que
pour des clefs qui sont des identifiants valide en Python. Dans les autres cas, toutes
les clefs valides sont utilisables.
Voici les opérations gérées par les dictionnaires, (par conséquent, d'autres types
de mapping peuvent les gérer aussi) :
list(d)
Return a list of all the keys used in the dictionary d.
len(d)
Renvoie le nombre d'éléments dans le dictionnaire d.
d[key]
Donne l'élément de d dont la clef est key. Lève une exception KeyError si key n'est
pas dans le dictionnaire.
>>>
d[key] = value
Assigne d[key] à value.
del d[key]
Supprime d[key] de d. Lève une exception KeyError si key n'est pas dans le
dictionnaire.
key in d
Renvoie True si d a la clef key, sinon False.
key not in d
Équivalent à not key in d.
iter(d)
Renvoie un itérateur sur les clefs du dictionnaire. C'est un raccourci
pour iter(d.keys()).
clear()
Supprime tous les éléments du dictionnaire.
copy()
Renvoie une copie de surface du dictionnaire.
classmethod fromkeys(iterable[, value])
Crée un nouveau dictionnaire avec les clefs de iterable et les valeurs à value.
get(key[, default])
Renvoie la valeur de key si key est dans le dictionnaire, sinon default. Si default n'est
pas donné, il vaut None par défaut, de manière à ce que cette méthode ne lève
jamais KeyError.
items()
Renvoie une nouvelle vue des éléments du dictionnaire (paires de (key, value)).
Voir la documentation des vues.
keys()
Renvoie une nouvelle vue des clefs du dictionnaire. Voir la documentation des vues.
pop(key[, default])
Si key est dans le dictionnaire elle est supprimée et sa valeur est renvoyée, sinon
renvoie default. Si default n'est pas donné et que key n'est pas dans le dictionnaire,
une KeyError est levée.
popitem()
Supprime et renvoie une paire (key, value) du dictionnaire. Les paires sont
renvoyées dans un ordre LIFO.
Modifié dans la version 3.7: L'ordre "dernier entré, premier sorti" (LIFO) est
désormais assuré. Dans les versions précédentes, popitem() renvoyait une paire
clé/valeur arbitraire.
setdefault(key[, default])
Si key est dans le dictionnaire, sa valeur est renvoyée. Sinon, insère key avec
comme valeur default et renvoie default. default vaut None par défaut.
update([other])
Met à jour le dictionnaire avec les paires de clef/valeur d'other, écrasant les clefs
existantes. Renvoie None.
values()
Renvoie une nouvelle vue des valeurs du dictionnaire. Voir la documentation des
vues.
>>>
>>> d = {'a': 1}
>>> d.values() == d.values()
False
Les dictionnaires préservent l'ordre des insertions. Notez que modifier une clé
n'affecte pas l'ordre. Les clés ajoutées après un effacement sont insérées à la fin.
>>>
Modifié dans la version 3.7: L'ordre d'un dictionnaire est toujours l'ordre des
insertions. Ce comportement était un détail d'implémentation de CPython depuis la
version 3.6.
Voir aussi
Les vues de dictionnaires peuvent être itérées et ainsi renvoyer les données du
dictionnaire, elle gèrent aussi les tests de présence :
len(dictview)
Renvoie le nombre d'entrées du dictionnaire.
iter(dictview)
Renvoie un itérateur sur les clefs, les valeurs, ou les éléments (représentés par
des tuples de (key, value) du dictionnaire.
Les clefs et les valeurs sont itérées dans l'ordre de leur insertion. Ceci permet la
création de paires de (key, value) en
utilisant zip() : pairs = zip(d.values(), d.keys()). Un autre moyen de
construire la même liste est pairs = [(v, k) for (k, v) in d.items()].
Parcourir des vues tout en ajoutant ou supprimant des entrées dans un dictionnaire
peut lever une RuntimeError ou ne pas fournir toutes les entrées.
Modifié dans la version 3.7: L'ordre d'un dictionnaire est toujours l'ordre des
insertions.
x in dictview
Renvoie True si x est dans les clefs, les valeurs, ou les éléments du dictionnaire
sous-jacent (dans le dernier cas, x doit être un tuple (key, value)).
Les vues de clefs sont semblables à des ensembles puisque leurs entrées sont
uniques et hachables. Si toutes les valeurs sont hachables, et qu'ainsi toutes les
paires de (key, value sont uniques et hachables, alors la vue donnée
par items() est aussi semblable à un ensemble. (Les vues données par items() ne
sont généralement pas traitées comme des ensembles, car leurs valeurs ne sont
généralement pas uniques.) Pour les vues semblables aux ensembles, toutes les
opérations définies dans la classe de base abstraite collections.abc.Set sont
disponibles (comme ==, <, ou ^).
>>>
>>> # iteration
>>> n = 0
>>> for val in values:
... n += val
>>> print(n)
504
>>> # keys and values are iterated over in the same order
(insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]
contextmanager.__enter__()
contextmanager.__exit__(exc_type, exc_val, exc_tb)
Sort du contexte et renvoie un booléen indiquant si une exception survenue doit être
supprimée. Si une exception est survenue lors de l'exécution du corps de
l'instruction with, les arguments contiennent le type de l'exception, sa valeur, et la
trace de la pile (traceback). Sinon les trois arguments valent None.
L'exception reçue ne doit jamais être relancée explicitement, cette méthode devrait
plutôt renvoyer une valeur fausse pour indiquer que son exécution s'est terminée
avec succès et qu'elle ne veut pas supprimer l'exception. Ceci permet au code de
gestion du contexte de comprendre si une méthode __exit__() a échoué.
Python définit plusieurs gestionnaires de contexte pour faciliter la synchronisation
des fils d'exécution, la fermeture des fichiers ou d'autres objets, et la configuration du
contexte arithmétique décimal. Ces types spécifiques ne sont pas traités
différemment, ils respectent simplement le protocole de gestion du contexte. Voir les
exemples dans la documentation du module contextlib.
Les generators de Python et le
décorateur contextlib.contextmanager permettent d'implémenter simplement
ces protocoles. Si un générateur est décoré avec contextlib. contextmanager,
elle renverra un gestionnaire de contexte implémentant les
méthodes __enter__() et __exit__(), plutôt que l'itérateur produit par un
générateur non décoré.
Notez qu'il n'y a pas d'emplacement spécifique pour ces méthodes dans la structure
de type pour les objets Python dans l'API Python/C. Les types souhaitant définir ces
méthodes doivent les fournir comme une méthode accessible en Python. Comparé
au coût de la mise en place du contexte d'exécution, les le coût d'un accès au
dictionnaire d'une classe unique est négligeable.
Modules
La seule opération spéciale sur un module est l'accès à ses attributs : m.name,
où m est un module et name donne accès un nom défini dans la table des symboles
de m. Il est possible d'assigner un attribut de module. (Notez que
l'instruction import n'est pas strictement une opération sur un objet
module. import foo ne nécessite pas qu'un objet module nommé foo existe, il
nécessite cependant une définition (externe) d'un module nommé foo quelque part.)
Fonctions
Les objets fonctions sont crées par les définitions de fonctions. La seule opération
applicable à un objet fonction est de l'appeler : func(argument-list).
Il existe en fait deux catégories d'objets fonctions : Les fonctions natives et les
fonctions définies par l'utilisateur. Les deux gèrent les mêmes opérations (l'appel à la
fonction), mais leur implémentation est différente, d'où les deux types distincts.
Méthodes
Les méthodes sont des fonctions appelées via la notation d'attribut. Il en existe deux
variantes : Les méthodes natives (tel que append() sur les listes), et les méthodes
d'instances de classes. Les méthodes natives sont représentées avec le type qui les
supporte.
Si vous accédez à une méthode (une fonction définie dans l'espace de nommage
d'une classe) via une instance, vous obtenez un objet spécial, une bound
method (aussi appelée instance method). Lorsqu'elle est appelée, elle ajoute
l'argument self à la liste des arguments. Les méthodes liées ont deux attributs
spéciaux, en lecture seule : m.__self__ est l'objet sur lequel la méthode travaille,
et m.__func__ est la fonction implémentant la méthode. Appeler m(arg-1, arg-
2, …, arg-n) est tout à fait équivalent à
appeler m.__func__(m.__self__, arg-1, arg-2, …, arg-n).
Comme les objets fonctions, les objets méthodes, liées, acceptent des attributs
arbitraires. Cependant, puisque les attributs de méthodes doivent être stockés dans
la fonction sous-jacente (meth.__func__), affecter des attributs à des objets bound
method est interdit. Toute tentative d'affecter un attribut sur un objet bound
method lèvera une AttributeError. Pour affecter l'attribut, vous devrez
explicitement l'affecter à sa fonction sous-jacente :
>>>
>>> class C:
... def method(self):
... pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method' # can't set on the
method
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'
Objets code
Les objets code sont utilisés par l'implémentation pour représenter du code Python
"pseudo-compilé", comme un corps de fonction. Ils sont différents des objets fonction
dans le sens où ils ne contiennent pas de référence à leur environnement global
d'exécution. Les objets code sont renvoyés par la fonction native compile() et
peuvent être obtenus des objets fonction via leur attribut __code__. Voir aussi le
module code.
Les objets code peuvent être exécutés ou évalués en les passant (au lieu d'une
chaîne contenant du code) aux fonction natives exec() ou eval().
Objets type
Les objets types représentent les différents types d'objets. Le type d'un objet est
obtenu via la fonction native type(). Il n'existe aucune opération spéciale sur les
types. Le module standard types définit les noms de tous les types natifs.
C'est écrit None.
C'est écrit Ellipsis ou ....
L'objet NotImplemented
Cet objet est renvoyé depuis des comparaisons ou des opérations binaires
effectuées sur des types qu'elles ne supportent pas. Voir Comparaisons pour plus
d'informations. Il n'y a qu'un seul objet NotImplemented. type(NotImplemented)
() renvoie un singleton.
C'est écrit NotImplemented.
Valeurs booléennes
Les valeurs booléennes sont les deux objets constants False et True. Ils sont
utilisés pour représenter les valeurs de vérité (bien que d'autres valeurs peuvent être
considérées vraies ou fausses). Dans des contextes numériques (par exemple en
argument d'un opérateur arithmétique), ils se comportent comme les nombres entiers
0 et 1, respectivement. La fonction native bool() peut être utilisée pour convertir
n'importe quelle valeur en booléen tant que la valeur peut être interprétée en une
valeur de vérité (voir Valeurs booléennes au dessus).
Objets internes
Voir Hiérarchie des types standards. Ils décrivent les objets stack frame, traceback,
et slice.
Attributs spéciaux
L'implémentation ajoute quelques attributs spéciaux et en lecture seule, à certains
types, lorsque ça a du sens. Certains ne sont pas listés par la fonction native dir().
object.__dict__
instance.__class__
class.__bases__
definition.__name__
definition.__qualname__
class.__mro__
Cet attribut est un tuple contenant les classes parents prises en compte lors de la
résolution de méthode.
class.mro()
Cette méthode peut être surchargée par une méta-classe pour personnaliser l'ordre
de la recherche de méthode pour ses instances. Elle est appelée à la l'initialisation
de la classe, et son résultat est stocké dans l'attribut __mro__.
class.__subclasses__()
Chaque classe garde une liste de références faibles à ses classes filles immédiates.
Cette méthode renvoie la liste de toutes ces références encore valables. Exemple :
>>>
>>> int.__subclasses__()
[<class 'bool'>]
Notes
Plus d'informations sur ces méthodes spéciales peuvent être trouvées dans
le Python Reference Manual (Personnalisation de base).
4(1,2,3,4)
5(1,2)
Pour insérer un tuple, vous devez donc donner un tuple d'un seul élément, contenant
le tuple à insérer.
Exceptions natives
En python, une exception est une instance d'une classe héritée de BaseException.
Dans un bloc try, la clause except traite non seulement la classe d'exception
qu'elle mentionne, mais aussi toutes les classes dérivées de cette classe
(contrairement à ses classes mères). Deux classes qui ne sont pas liées par héritage
ne sont jamais équivalentes, même si elles ont le même nom.
Les exceptions natives présentes ci-dessous peuvent être levées par l'interpréteur ou
par les fonctions natives. Sauf mention contraire, une "valeur associée" indique la
cause de l'erreur. Cela peut être une chaîne ou un tuple contenant plusieurs
éléments d'information (e.g., un code d'erreur ou un message explicatif). Cette valeur
associée est généralement donnée en argument du constructeur de la classe.
Du code utilisateur peut lever des exceptions natives. Cela peut être utilisé pour
tester un gestionnaire d'exception ou pour rapporter une condition d'erreur "comme
si" c'était l'interpréteur qui levait cette exception ; mais attention car rien n'empêche
du code utilisateur de lever une erreur inappropriée.
Les classes d'exception natives peuvent être héritées pour définir de nouvelles
exceptions ; les programmeurs sont encouragés à faire dériver les nouvelles
exceptions de la classe Exception ou d'une de ses sous-classes, et non
de BaseException. Plus d'informations sur la définition des exceptions sont
disponibles dans le Tutoriel Python sous Exceptions définies par l'utilisateur.
Le code d'affichage par défaut de la trace d'appels montre ces exceptions chaînées
en plus de la trace de l'exception elle-même. Une exception chaînée explicitement
dans __cause__ est toujours affichée si présente. Une exception implicitement
chaînée dans __context__ n'est affichée que
si __cause__ est None et __suppress_context__ est faux.
Dans les deux cas, l'exception elle-même est toujours affichée après toutes les
exceptions enchaînées, de sorte que la dernière ligne de la trace d'appels montre
toujours la dernière exception qui a été levée.
Classes de base
Les exceptions suivantes sont utilisées principalement en tant que classes de base
pour d'autres exceptions.
exception BaseException
La classe de base pour toutes les exceptions natives. Elle n'est pas vouée à être
héritée directement par des classes utilisateur (pour cela, utilisez Exception).
Si str() est appelée sur une instance de cette classe, la représentation du ou des
argument(s) de l'instance est retournée, ou la chaîne vide s'il n'y avait pas
d'arguments.
args
Le tuple d'arguments donné au constructeur d'exception. Certaines exceptions
natives (comme OSError) attendent un certain nombre d'arguments et attribuent une
signification spéciale aux éléments de ce tuple, alors que d'autres ne sont
généralement appelées qu'avec une seule chaîne de caractères rendant un message
d'erreur.
with_traceback(tb)
Cette méthode définit tb en tant que nouvelle trace d'appels pour l'exception et
retourne l'objet exception. Elle est généralement utilisée dans du code de gestion
d'exceptions comme ceci :
try:
...
except SomeException:
tb = sys.exc_info()[2]
raise OtherException(...).with_traceback(tb)
exception Exception
Toutes les exceptions natives, qui n'entraînent pas une sortie du système dérivent de
cette classe. Toutes les exceptions définies par l'utilisateur devraient également être
dérivées de cette classe.
exception ArithmeticError
La classe de base pour les exceptions natives qui sont levées pour diverses erreurs
arithmétiques : OverflowError, ZeroDivisionError, FloatingPointError.
exception BufferError
Levée lorsqu'une opération liée à un tampon ne peut pas être exécutée.
exception LookupError
La classe de base pour les exceptions qui sont levées lorsqu'une clé ou un index
utilisé sur un tableau de correspondances ou une séquence est
invalide : IndexError, KeyError. Peut être levée directement
par codecs.lookup().
Exceptions concrètes
Les exceptions suivantes sont celles qui sont habituellement levées.
exception AssertionError
exception AttributeError
exception EOFError
exception FloatingPointError
exception GeneratorExit
exception ImportError
exception ModuleNotFoundError
exception IndexError
Levée lorsqu'un indice de séquence est hors de la plage. (Les indices de tranches
(slices) sont tronqués silencieusement pour tomber dans la plage autorisée ; si un
indice n'est pas un entier, TypeError est levée.)
exception KeyError
Levée lorsqu'une clef (de dictionnaire) n'est pas trouvée dans l'ensemble des clefs
existantes.
exception KeyboardInterrupt
exception MemoryError
Levée lorsqu'une opération est à court de mémoire mais que la situation peut encore
être rattrapée (en supprimant certains objets). La valeur associée est une chaîne de
caractères indiquant quel type d'opération (interne) est à court de mémoire. À noter
qu'en raison de l'architecture interne de gestion de la mémoire (la
fonction malloc() du C), l'interpréteur peut ne pas toujours être capable de rattraper
cette situation ; il lève néanmoins une exception pour qu'une pile d'appels puisse être
affichée, dans le cas où un programme en cours d'exécution en était la cause.
exception NameError
Levée lorsqu'un nom local ou global n'est pas trouvé. Ceci ne s'applique qu'aux
noms non qualifiés. La valeur associée est un message d'erreur qui inclut le nom qui
n'a pas pu être trouvé.
exception NotImplementedError
Cette exception est dérivée de RuntimeError. Dans les classes de base définies
par l'utilisateur, les méthodes abstraites devraient lever cette exception lorsqu'elles
nécessitent des classes dérivées pour remplacer la méthode, ou lorsque la classe
est en cours de développement pour indiquer que l'implémentation concrète doit
encore être ajoutée.
Note
Elle ne devrait pas être utilisée pour indiquer qu'un opérateur ou qu'une méthode
n'est pas destiné à être pris en charge du tout -- dans ce cas, laissez soit l'opérateur /
la méthode non défini, soit, s'il s'agit d'une sous-classe, assignez-le à None.
Note
exception OSError(errno, strerror[, filename[, winerror[, filename2]]])
Cette exception est levée lorsqu'une fonction système retourne une erreur liée au
système, incluant les erreurs entrées-sorties telles que "fichier non trouvé" ou
"disque plein" (pas pour les types d'arguments illégaux ou d'autres erreurs
accidentelles).
winerror
Sous Windows, cela donne le code d'erreur Windows natif. L'attribut errno est alors
une traduction approximative, en termes POSIX, de ce code d'erreur natif.
strerror
Le message d'erreur correspondant, tel que fourni par le système d'exploitation. Il est
formaté par les fonctions C perror() sous POSIX, et FormatMessage() sous
Windows.
filename
filename2
Pour les exceptions qui font référence à un chemin d'accès au système de fichiers
(comme open() ou os.unlink()), filename est le nom du fichier transmis à la
fonction. Pour les fonctions qui font référence à deux chemins d'accès au système de
fichiers (comme os.rename()), filename2 correspond au deuxième nom de fichier
passé à la fonction.
exception OverflowError
Levée lorsque le résultat d'une opération arithmétique est trop grand pour être
représenté. Cela ne peut pas se produire pour les entiers (qui préfèrent
lever MemoryError plutôt que d'abandonner). Cependant, pour des raisons
historiques, OverflowError est parfois levée pour des entiers qui sont en dehors d'une
plage requise. En raison de l'absence de normalisation de la gestion des exceptions
de virgule flottante en C, la plupart des opérations en virgule flottante ne sont pas
vérifiées.
exception RecursionError
Cette exception est dérivée de RuntimeError. Elle est levée lorsque l'interpréteur
détecte que la profondeur de récursivité maximale
(voir sys.getrecursionlimit()) est dépassée.
exception ReferenceError
Cette exception est levée lorsqu'un pointeur faible d'un objet proxy, créé par la
fonction weakref.proxy(), est utilisé pour accéder à un attribut du référent après
qu'il ait été récupéré par le ramasse-miettes. Pour plus d'informations sur les
pointeurs faibles, voir le module weakref.
exception RuntimeError
Levée lorsqu'une erreur qui n'appartient à aucune des autres catégories est
détectée. La valeur associée est une chaîne de caractères indiquant précisément ce
qui s'est mal passé.
exception StopIteration
Modifié dans la version 3.7: Active PEP 479 pour tout le code par défaut : quand une
erreur StopIteration est levée dans un générateur elle est transformée en
une RuntimeError.
exception StopAsyncIteration
exception SyntaxError
Levée lorsque l'analyseur syntaxique rencontre une erreur de syntaxe. Cela peut se
produire dans une instruction import, dans un appel aux fonctions
natives exec() ou eval(), ou lors de la lecture du script initial ou de l'entrée
standard (également de manière interactive).
exception IndentationError
Classe de base pour les erreurs de syntaxe liées à une indentation incorrecte. C'est
une sous-classe de SyntaxError.
exception TabError
exception SystemError
Levée lorsque l'interpréteur trouve une erreur interne, mais que la situation ne
semble pas si grave au point de lui faire abandonner tout espoir. La valeur associée
est une chaîne de caractères indiquant l'erreur qui est survenue (en termes bas
niveau).
exception SystemExit
code
L'état de sortie ou le message d'erreur passé au constructeur. ( None par défaut.)
exception TypeError
Cette exception peut être levée par du code utilisateur pour indiquer qu'une tentative
d'opération sur un objet n'est pas prise en charge, et n'est pas censée l'être. Si un
objet est destiné à prendre en charge une opération donnée mais n'a pas encore
fourni une implémentation, lever NotImplementedError est plus approprié.
exception UnboundLocalError
Levée lorsqu'une référence est faite à une variable locale dans une fonction ou une
méthode, mais qu'aucune valeur n'a été liée à cette variable. C'est une sous-classe
de NameError.
exception UnicodeError
encoding
Le nom de l'encodage qui a provoqué l'erreur.
reason
Une chaîne de caractères décrivant l'erreur de codec spécifique.
object
L'objet que le codec essayait d'encoder ou de décoder.
start
Le premier index des données invalides dans object.
end
L'index après la dernière donnée invalide dans object.
exception UnicodeEncodeError
Levée lorsqu'une erreur liée à Unicode se produit durant l'encodage. C'est une sous-
classe d'UnicodeError.
exception UnicodeDecodeError
Levée lorsqu'une erreur liée à Unicode se produit durant le décodage. C'est une
sous-classe d'UnicodeError.
exception UnicodeTranslateError
Levée lorsqu'une erreur liée à Unicode se produit durant la traduction. C'est une
sous-classe d'UnicodeError.
exception ValueError
Levée lorsqu'une opération ou fonction native reçoit un argument qui possède le bon
type mais une valeur inappropriée, et que la situation n'est pas décrite par une
exception plus précise telle que IndexError.
exception ZeroDivisionError
Levée lorsque le second argument d'une opération de division ou d'un modulo est
zéro. La valeur associée est une chaîne indiquant le type des opérandes et de
l'opération.
Les exceptions suivantes sont conservées pour la compatibilité avec les anciennes
versions ; depuis Python 3.3, ce sont des alias d' OSError.
exception EnvironmentError
exception IOError
exception WindowsError
Exceptions système
Les exceptions suivantes sont des sous-classes d' OSError, elles sont levées en
fonction du code d'erreur système.
exception BlockingIOError
characters_written
Un nombre entier contenant le nombre de caractères écrits dans le flux avant qu'il ne
soit bloqué. Cet attribut est disponible lors de l'utilisation des classes tampon
entrées-sorties du module io.
exception ChildProcessError
Les sous-classes
sont BrokenPipeError, ConnectionAbortedError, ConnectionRefusedError
et ConnectionResetError.
exception BrokenPipeError
exception ConnectionAbortedError
exception ConnectionRefusedError
exception ConnectionResetError
exception FileExistsError
exception FileNotFoundError
Levée lorsqu'un fichier ou répertoire est demandé mais n'existe pas. Correspond
à errno ENOENT.
exception InterruptedError
Levée lorsqu'un appel système est interrompu par un signal entrant. Correspond
à errno EINTR.
Modifié dans la version 3.5: Python relance maintenant les appels système lorsqu'ils
sont interrompus par un signal, sauf si le gestionnaire de signal lève une exception
(voir PEP 475 pour les raisons), au lieu de lever InterruptedError.
exception IsADirectoryError
exception NotADirectoryError
exception PermissionError
Levée lorsqu'on essaye d'exécuter une opération sans les droits d'accès adéquats —
par exemple les permissions du système de fichiers. Correspond
à errno EACCES et EPERM.
exception ProcessLookupError
exception TimeoutError
Voir aussi
Avertissements
Les exceptions suivantes sont utilisées comme catégories d'avertissement ;
voir warning-categories pour plus d'informations.
exception Warning
exception DeprecationWarning
Classe de base pour les avertissements sur les fonctionnalités obsolètes, lorsque
ces avertissements sont destinés aux autres développeurs Python.
exception PendingDeprecationWarning
Cette classe est rarement utilisée car émettre un avertissement à propos d’une
obsolescence à venir est inhabituel, et DeprecationWarning est préféré pour les
obsolescences actuelles.
exception SyntaxWarning
exception RuntimeWarning
Classe de base pour les avertissements sur les comportements d'exécution douteux.
exception FutureWarning
exception ImportWarning
Classe de base pour les avertissements sur des erreurs probables dans les
importations de modules.
exception UnicodeWarning
exception BytesWarning
exception ResourceWarning
Classe de base pour les avertissements liés à l'utilisation de ressources. Ignorée par
les filtres d’avertissements par défaut.
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
Services de Manipulation de Texte
Les modules décrits dans ce chapitre fournissent un large ensemble d'opérations de
manipulation sur les chaînes de caractères et le texte en général.
Voir aussi
Chaînes constantes
Les constantes définies dans ce module sont :
string.ascii_letters
string.ascii_lowercase
Les lettres minuscules 'abcdefghijklmnopqrstuvwxyz'. Cette valeur de dépend
pas de l'environnement linguistique et ne changera pas.
string.ascii_uppercase
string.digits
La chaîne '0123456789'.
string.hexdigits
La chaîne '0123456789abcdefABCDEF'.
string.octdigits
La chaîne '01234567.
string.punctuation
string.printable
string.whitespace
Une chaîne comprenant tous les caractères ASCII considérés comme espaces. Sont
inclus les caractères espace, tabulations, saut de ligne, retour du chariot, saut de
page, et tabulation verticale.
class string.Formatter
La classe Formatter a les méthodes publiques suivantes :
format(format_string, *args, **kwargs)
La méthode principale de l'API. Elle prend une chaîne de format et un ensemble
arbitraire d'arguments positions et mot-clefs. C'est uniquement un conteneur qui
appelle vformat().
vformat(format_string, args, kwargs)
Cette fonction fait le travail effectif du formatage. Elle existe comme méthode
séparée au cas où vous voudriez passer un dictionnaire d'arguments prédéfini plutôt
que décompresser et recompresser le dictionnaire en arguments individuels en
utilisant la syntaxe *args et **kwargs. vformat() s'occupe de découper la chaîne
de format en données de caractères et champs de remplacement. Elle appelle les
différentes méthodes décrites ci-dessous.
parse(format_string)
Boucle sur la chaîne de format et renvoie un itérable
de tuples (literal_text, field_name, format_spec, conversion). Ceci est utilisé
par vformat() pour découper la chaîne de format en littéraux ou en champs de
remplacement.
get_field(field_name, args, kwargs)
Récupère le champ field_name du tuple renvoyé par parse() (voir ci-dessus), le
convertit en un objet à formater. Renvoie un tuple (obj, used_key). La version par
défaut prend une chaîne de la forme définie par PEP 3101, telle
que "0[name]" ou "label.title". args et kwargs sont tels que ceux passés
à vformat(). La valeur renvoyée used_key a le même sens que le
paramètre key de get_value().
get_value(key, args, kwargs)
Récupère la valeur d'un champ donné. L'argument key est soit un entier, soit une
chaîne. Si c'est un entier, il représente l'indice de la l'argument dans args. Si c'est
une chaîne de caractères, elle représente le nom de l'argument dans kwargs.
Pour les noms de champs composés, ces fonctions sont uniquement appelées sur la
première composante du nom. Les composantes suivantes sont manipulées au
travers des attributs normaux et des opérations sur les indices.
Si l'indice ou le mot-clef fait référence à un objet qui n'existe pas, alors une
exception IndexError ou KeyError doit être levée.
check_unused_args(used_args, args, kwargs)
Implémente une vérification pour les arguments non utilisés si désiré. L'argument de
cette fonction est l'ensemble des clefs qui ont été effectivement référencées dans la
chaîne de format (des entiers pour les indices et des chaînes de caractères pour les
arguments nommés), et une référence vers les arguments args et kwargs qui ont été
passés à vformat. L'ensemble des arguments non utilisés peut être calculé sur base
de ces paramètres. check_unused_args() est censée lever une exception si la
vérification échoue.
format_field(value, format_spec)
La méthode format_field() fait simplement appel à la primitive
globale format(). Cette méthode est fournie afin que les sous-classes puisse la
redéfinir.
convert_field(value, conversion)
Convertit la valeur (renvoyée par get_field()) selon un type de conversion donné
(comme dans le tuple renvoyé par la méthode parse()). La version par défaut
comprend 's' (str), 'r' (repr) et 'a' (ASCII) comme types de conversion.
Syntaxe de formatage de chaîne
La méthode str.format() et la classe Formatter partagent la même syntaxe
pour les chaînes de formatage (bien que dans le cas de Formatter les sous-classes
puissent définir leur propre syntaxe). La syntaxe est liée à celle des chaînes de
formatage littérales, mais il y a quelques différences.
Quelques exemples :
La plupart des types natifs gèrent un mini-langage de formatage usuel qui est décrit
dans la section suivante.
La plupart des primitives implémentent les les options suivantes, même si certaines
options de formatage ne sont supportées que pour les types numériques.
A general convention is that an empty format specification produces the same result
as if you had called str() on the value. A non-empty format specification typically
modifies the result.
Si une valeur valide est spécifiée pour align, elle peut être précédée par un
caractère fill, qui peut être n'importe quel caractère (espace par défaut si la valeur est
omise). Il n'est pas possible d'utiliser une accolade littérale (" {" ou "}") comme
caractère fill dans une chaîne de formatage littérale ou avec la
méthode str.format(). Cependant, il est possible d'insérer une accolade à l'aide
d'un champ de remplacement imbriqué. Cette limitation n'affecte pas la
fonction format().
Optio
Signification
n
Optio
Signification
n
L'option '_' demande l'utilisation d'un tiret bas comme séparateur des milliers pour
les représentations de nombres flottants et pour les entiers représentés par le
type 'd'. Pour les types de représentation d'entiers 'b', 'o', 'x' et 'X', les tirets
bas seront insérés tous les 4 chiffres. Pour les autres types de représentation,
spécifier cette option est une erreur.
width is a decimal integer defining the minimum total field width, including any
prefixes, separators, and other formatting characters. If not specified, then the field
width will be determined by the content.
Type Signification
Type Signification
En plus des types de représentation ci-dessus, les entiers peuvent aussi être
formatés avec les types de représentation des flottants listés ci-dessous (à
l'exception de 'n' et None). Dans ce cas, la fonction float() est utilisée pour
convertir l'entier en flottant avant le formatage.
Les types de représentation pour les nombres flottants et les valeurs décimales
sont :
Type Signification
Dans la plupart des cases, la syntaxe est similaire à l'ancien formatage par %, avec
l'ajout de {} et avec : au lieu de %. Par exemple : '%03.2f' peut être changé
en '{03.2f}'.
>>>
>>>
>>>
>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part
{0.real} '
... 'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and
the imaginary part -5.0.'
>>> class Point:
... def __init__(self, x, y):
... self.x, self.y = x, y
... def __str__(self):
... return 'Point({self.x}, {self.y})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'
Remplacer %s et %r :
>>>
>>>
>>>
>>>
>>>
>>> '{:,}'.format(1234567890)
'1,234,567,890'
Exprimer un pourcentage :
>>>
>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'
>>>
>>>
Chaînes modèles
Les chaînes modèles fournissent des substitutions de chaînes plus simples, comme
décrit dans PEP 292. L’internationalisation (i18n) est un cas d’utilisation principale
pour les chaînes modèles, car dans ce contexte, la syntaxe et les fonctionnalités
simplifiées facilitent la traduction par rapport aux autres fonctions de formatage de
chaînes intégrées en Python. Comme exemple de bibliothèque construite sur des
chaînes modèles pour l'internationalisation, voir le paquet flufl.i18n
<http://flufli18n.readthedocs.io/en/latest/>.
Les chaînes modèles prennent en charge les substitutions basées sur $ en utilisant
les règles suivantes :
substitute(mapping, **kwds)
Applique les substitutions du template, et la renvoie dans une nouvelle
chaîne. mapping est un objet dictionnaire-compatible qui lie les substituants dans
le template. De même, vous pouvez fournir des arguments mot-clefs tels que les
mot-clefs sont les substituants. Quand à la fois mapping et kwds sont donnés et qu'il
y a des doublons, les substituants de kwds sont prioritaires.
safe_substitute(mapping, **kwds)
Comme substitute(), si ce n'est qu'au lieu de lever une KeyError si un
substituant n'est ni dans mapping, ni dans kwds, c'est le nom du substituant
inchangé qui apparaît dans la chaîne finale. Également, à l'inverse
de substitute(), toute autre apparition de $ renverra simplement $ au lieu de
lever une exception ValueError.
Bien que d'autres exceptions peuvent toujours être levées, cette méthode est dite
sûre car elle tente de toujours renvoyer une chaîne utilisable au lieu de lever une
exception. Ceci dit, safe_substitute() est tout sauf sûre car elle ignore
silencieusement toute malformation dans le template qui contient des délimiteurs
fantômes, des accolades non fermées, ou des substituants qui ne sont pas des
identificateurs Python valides.
template
C'est l'objet template passé comme argument au constructeur. En général, vous ne
devriez pas le changer, mais un accès en lecture-seule n'est pas possible à fournir.
>>>
Note
Modifié dans la version 3.7: braceidpattern peut être utilisé pour définir des motifs
des motifs différents suivant qu’ils sont à l’intérieur ou à l’extérieur des accolades.
Ce module fournit des opérations sur les expressions rationnelles similaires à celles
que l'on trouve dans Perl.
Les motifs, comme les chaînes, à analyser peuvent aussi bien être des chaînes
Unicode (str) que des chaînes 8-bits (bytes). Cependant, les chaînes Unicode et 8-
bits ne peuvent pas être mélangées : c’est à dire que vous ne pouvez pas analyser
une chaîne Unicode avec un motif 8-bit, et inversement ; de même, lors d'une
substitution, la chaîne de remplacement doit être du même type que le motif et la
chaîne analysée.
La solution est d'utiliser la notation des chaînes brutes en Python pour les
expressions rationnelles ; Les backslashs ne provoquent aucun traitement spécifique
dans les chaînes littérales préfixées par 'r'. Ainsi, r"\n" est une chaîne de deux
caractères contenant '\' et 'n', tandis que "\n" est une chaîne contenant un
unique caractère : un saut de ligne. Généralement, les motifs seront exprimés en
Python à l'aide de chaînes brutes.
Il est important de noter que la plupart des opérations sur les expressions
rationnelles sont disponibles comme fonctions au niveau du module et comme
méthodes des expressions rationnelles compilées. Les fonctions sont des raccourcis
qui ne vous obligent pas à d'abord compiler un objet regex, mais auxquelles
manquent certains paramètres de configuration fine.
Voir aussi
Une brève explication sur le format des expressions rationnelles suit. Pour de plus
amples informations et une présentation plus simple, référez-vous au Guide des
expressions régulières.
(Point.) Dans le mode par défaut, il valide tout caractère à l'exception du saut de
ligne. Si l'option DOTALL a été spécifiée, il valide tout caractère, saut de ligne
compris.
^
(Accent circonflexe.) Valide le début d'une chaîne de caractères, ainsi que ce qui suit
chaque saut de ligne en mode MULTILINE.
Valide la fin d'une chaîne de caractères, ou juste avant le saut de ligne à la fin de la
chaîne, ainsi qu'avant chaque saut de ligne en mode MULTILINE. foo valide à la
fois foo et foobar, tandis que l'expression rationnelle foo$ ne correspond
qu'à 'foo'. Plus intéressant, chercher foo.$ dans 'foo1\nfoo2\n' trouve
normalement 'foo2', mais 'foo1' en mode MULTILINE ; chercher un
simple $ dans 'foo\n' trouvera deux correspondances (vides) : une juste avant le
saut de ligne, et une à la fin de la chaîne.
*?, +?, ??
{m}
{m,n}
Fait valider par l'expression rationnelle résultante entre m et n répétitions de
l'expression qui précède, cherchant à en valider le plus possible. Par
exemple, a{3,5} validera entre 3 et 5 caractères 'a'. Omettre m revient à spécifier
0 comme borne inférieure, et omettre n à avoir une borne supérieure infinie. Par
exemple, a{4,}b correspondra à 'aaaab' ou à un millier de caractères 'a' suivis
d'un 'b', mais pas à 'aaab'. La virgule ne doit pas être omise, auquel cas le
modificateur serait confondu avec la forme décrite précédemment.
{m,n}?
Si vous n'utilisez pas de chaînes brutes pour exprimer le motif, souvenez-vous que
Python utilise aussi le backslash comme une séquence d'échappement dans les
chaînes littérales ; si la séquence d'échappement n'est pas reconnue par
l'interpréteur Python, le backslash et les caractères qui le suivent sont inclus dans la
chaîne renvoyée. Cependant, si Python reconnait la séquence, le backslash doit être
doublé (pour ne plus être reconnu). C'est assez compliqué et difficile à comprendre,
c'est pourquoi il est hautement recommandé d'utiliser des chaînes brutes pour tout
sauf les expressions les plus simples.
[]
(...)
(?...)
Il s'agit d'une notation pour les extensions (un '?' suivant une '(' n'a pas de sens
autrement). Le premier caractère après le '?' détermine quel sens donner à
l'expression. Les extensions ne créent généralement pas de nouveaux groupes ; (?
P<name>...) est la seule exception à la règle. Retrouvez ci-dessous la liste des
extensions actuellement supportées.
(?aiLmsux)
(?:...)
Une version sans capture des parenthèses habituelles. Valide n'importe quelle
expression rationnelle à l'intérieur des parenthèses, mais la sous-chaîne
correspondant au groupe ne peut pas être récupérée après l'analyse ou être
référencée plus loin dans le motif.
(?aiLmsux-imsx:...)
(?P<name>...)
Similaires aux parenthèses habituelles, mais la sous-chaîne validée par le groupe est
accessible via le nom name du groupe symbolique. Les noms de groupes doivent
être des identifiants Python valides, et chaque nom de groupe ne doit être défini
qu'une seule fois dans une expression rationnelle. Un groupe symbolique est aussi
un groupe numéroté, de la même manière que si le groupe n'était pas nommé.
Les groupes nommés peuvent être référencés dans trois contextes. Si le motif est (?
P<quote>['"]).*?(?P=quote) (i.e. correspondant à une chaîne entourée de
guillemets simples ou doubles) :
m.group('quote')
en analysant l'objet résultat m
m.end('quote') (etc.)
\g<quote>
dans une chaîne passée à
\g<1>
l'argument repl de re.sub()
\1
(?P=name)
Une référence arrière à un groupe nommé ; elle correspond à n'importe quel texte
validé plus tôt par le groupe nommé name.
(?#...)
(?=...)
Valide si ... valide la suite, mais ne consomme rien de la chaîne. On appelle cela
une assertion lookahead. Par exemple, Isaac (?=Asimov) correspondra à la
chaîne 'Isaac' `` seulement si elle est suivie par ``'Asimov'.
(?!...)
Valide si ... ne valide pas la suite. C'est une assertion negative lookahead. Par
exemple, Isaac (?!Asimov) correspondra à la chaîne 'Isaac ' seulement si
elle n'est pas suivie par 'Asimov'.
(?<=...)
Valide si la position courante dans la chaîne est précédée par une correspondance
sur ... qui se termine à la position courante. On appelle cela une positive
lookbehind assertion. (?<=abc)def cherchera une correspondance dans 'abcdef',
puisque le lookbehind* mettra de côté 3 caractères et vérifiera que le motif contenu
correspond. Le motif ne devra correspondre qu'à des chaînes de taille fixe, cela veut
dire que abc ou a|b` sont autorisées, mais pas ``a* ou a{3,4}. Notez que
les motifs qui commencent par des assertions lookbehind positives ne peuvent pas
correspondre au début de la chaîne analysée ; vous préférerez sûrement utiliser la
fonction search() plutôt que la fonction match() :
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
Modifié dans la version 3.5: Ajout du support des références aux groupes de taille
fixe.
(?<!...)
Valide si la position courante dans la chaîne n'est pas précédée par une
correspondance sur .... On appelle cela une negative lookbehind assertion. À la
manière des assertions lookbehind positives, le motif contenu ne peut que
correspondre à des chaînes de taille fixe. Les motifs débutant par une
assertion lookbehind négative peuvent correspondre au début de la chaîne analysée.
(?(id/name)yes-pattern|no-pattern)
Essaiera de faire la correspondance avec yes-pattern si le groupe indiqué
par id ou name existe, et avec no-pattern s'il n'existe pas. no-pattern est
optionnel et peut être omis. Par exemple, (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|
$) est un motif simpliste pour identifier une adresse courriel, qui
validera '<user@host.com>' ainsi que 'user@host.com' mais
pas '<user@host.com' ni 'user@host.com>'.
Les séquences spéciales sont composées de '\' et d'un caractère de la liste qui
suit. Si le caractère ordinaire n'est pas un chiffre ASCII ou une lettre ASCII, alors
l'expression rationnelle résultante validera le second caractère de la séquence. Par
exemple, \$ correspond au caractère '$'.
\number
\A
\b
Correspond à la chaîne vide, mais uniquement au début ou à la fin d'un mot. Un mot
est défini comme une séquence de "caractères de mots". Notez que
formellement, \b est défini comme la liaison entre \w et \W (et inversement), ou
entre \w et le début/fin d'un mot. Cela signifie
que r'\bfoo\b' validera 'foo', 'foo.', '(foo)' ou 'bar foo baz' mais
pas 'foobar' ou 'foo3'.
Les caractères alphanumériques Unicode sont utilisés par défaut dans les motifs
Unicode, mais cela peut être changé en utilisant l'option ASCII. Les délimitations de
mots sont déterminées par la locale si l'option LOCALE est utilisée. À l'intérieur d'un
intervalle de caractères, \b représente le caractère backspace, par compatibilité
avec les chaînes littérales Python.
\B
Correspond à la chaîne vide, mais uniquement quand elle n'est pas au début ou à la
fin d'un mot. Cela signifie que r'py\B' valide 'python', 'py3' ou 'py2', mais
pas 'py', 'py.' ou 'py!'. \B est simplement l'opposé de \b, donc les caractères
de mots dans les motifs Unicode sont les alphanumériques et tirets bas Unicode,
bien que cela puisse être changé avec l'option ASCII. Les délimitations de mots sont
déterminées par la locale si l'option LOCALE est utilisée.
\d
Valide n'importe quel chiffre décimal Unicode (soit tout caractère Unicode de
catégorie [Nd]). Cela inclut [0-9], mais aussi bien d'autres caractères de chiffres. Si
l'option ASCII est utilisée, seuls les caractères de la classe [0-9] correspondront.
\D
Valide tout caractère qui n'est pas un chiffre décimal. C'est l'opposé de \d. Si
l'option ASCII est utilisée, cela devient équivalent à [^0-9].
\s
Valide les caractères considérés comme des espacements dans la table ASCII ;
équivalent à [ \t\n\r\f\v].
\S
Valide tout caractère qui n'est pas un caractère d'espacement. c'est l'opposé de \s.
Si l'option ASCII est utilisée, cela devient équivalent à [^ \t\n\r\f\v].
\w
Valide les caractères Unicode de mot ; cela inclut la plupart des caractères qui
peuvent être compris dans un mot d'une quelconque langue, aussi bien que les
nombres et les tirets bas. Si l'option ASCII est utilisée, seuls les caractères de la
classe [a-zA-Z0-9_] sont validés.
\W
Matches any character which is not a word character. This is the opposite of \w. If
the ASCII flag is used this becomes the equivalent of [^a-zA-Z0-9_]. If
the LOCALE flag is used, matches characters which are neither alphanumeric in the
current locale nor the underscore.
\Z
La plupart des échappements standards supportés par les chaînes littérales sont
aussi acceptés par l'analyseur d'expressions rationnelles :
\a \b \f \n
\r \t \u \U
\v \x \\
(Notez que \b est utilisé pour représenter les bornes d'un mot, et signifie
« backspace » uniquement à l'intérieur d'une classe de caractères.)
Les séquences octales d'échappement sont incluses dans une forme limitée. Si le
premier chiffre est un 0, ou s'il y a trois chiffres octaux, la séquence est considérée
comme octale. Autrement, il s'agit d'une référence vers un groupe. Comme pour les
chaînes littérales, les séquences octales ne font jamais plus de 3 caractères de long.
Modifié dans la version 3.6: Les constantes d'options sont maintenant des instances
de RegexFlag, sous-classe de enum.IntFlag.
re.compile(pattern, flags=0)
La séquence
prog = re.compile(pattern)
result = prog.match(string)
est équivalente à
Note
Les versions compilées des motifs les plus récents passés à re.compile() et
autres fonctions d'analyse du module sont mises en cache, ainsi les programmes qui
n'utilisent que quelques expressions rationnelles en même temps n'ont pas à
s'inquiéter de la compilation de ces expressions.
re.A
re.ASCII
Fait correspondre à \w, \W, \b, \B, \d, \D, \s et \s des caractères ASCII seulement,
plutôt qu'Unicode. Cela n'a du sens que pour les motifs Unicode, et est ignoré pour
les motifs 8-bit. Correspond à l'option de groupe (?a).
re.DEBUG
re.I
re.IGNORECASE
re.L
re.LOCALE
re.M
re.MULTILINE
re.S
re.DOTALL
Fait correspondre tous les caractères possibles à '.', incluant le saut de ligne ; sans
cette option, '.' correspondrait à tout caractère à l'exception du saut de ligne.
Correspond à l'option de groupe (?s).
re.X
re.VERBOSE
Cette option vous autorise à écrire des expressions rationnelles qui présentent mieux
et sont plus lisibles en vous permettant de séparer visuellement les sections logiques
du motif et d'ajouter des commentaires. Les caractères d'espacement à l'intérieur du
motif sont ignorés, sauf à l'intérieur des classes de caractères ou quand précédés
d'un backslash non échappé, ou dans des séquences comme *?, (?: or (?P<...>.
Quand une ligne contient un # qui n'est pas dans une classe de caractères ou
précédé d'un backslash non échappé, tous les caractères depuis le # le plus à
gauche jusqu'à la fin de la ligne sont ignorés.
Cela signifie que les deux expressions rationnelles suivantes qui valident un nombre
décimal sont fonctionnellement égales :
re.search(pattern, string, flags=0)
re.match(pattern, string, flags=0)
re.fullmatch(pattern, string, flags=0)
re.split(pattern, string, maxsplit=0, flags=0)
>>>
>>>
De cette manière, les séparateurs sont toujours trouvés aux mêmes indices relatifs
dans la liste résultante.
re.findall(pattern, string, flags=0)
re.finditer(pattern, string, flags=0)
re.sub(pattern, repl, string, count=0, flags=0)
>>>
>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
... r'static PyObject*\npy_\1(void)\n{',
... 'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'
Si repl est une fonction, elle est appelée pour chaque occurrence non chevauchante
de pattern. La fonction prend comme argument un objet de correspondance, et
renvoie la chaîne de remplacement. Par exemple :
>>>
Modifié dans la version 3.5: Les groupes sans correspondance sont remplacés par
une chaîne vide.
re.subn(pattern, repl, string, count=0, flags=0)
re.escape(pattern)
Échappe tous les caractères spéciaux de pattern. Cela est utile si vous voulez valider
une quelconque chaîne littérale qui pourrait contenir des métacaractères
d'expressions rationnelles. Par exemple :
>>>
>>> print(re.escape('http://www.python.org'))
http://www\.python\.org
This function must not be used for the replacement string in sub() and subn(), only
backslashes should be escaped. For example:
>>>
Modifié dans la version 3.7: Only characters that can have special meaning in a
regular expression are escaped. As a
result, '!', '"', '%', "'", ',', '/', ':', ';', '<', '=', '>', '@', and "`" are no
longer escaped.
re.purge()
Exception levée quand une chaîne passée à l'une des fonctions ici présentes n'est
pas une expression rationnelle valide (contenant par exemple une parenthèse non
fermée) ou quand d'autres erreurs se produisent durant la compilation ou l'analyse. Il
ne se produit jamais d'erreur si une chaîne ne contient aucune correspondance pour
un motif. Les instances de l'erreur ont les attributs additionnels suivants :
msg
Le message d'erreur non formaté.
pattern
Le motif d'expression rationnelle.
pos
L'index dans pattern où la compilation a échoué (peut valoir None).
lineno
La ligne correspondant à pos (peut valoir None).
colno
La colonne correspondant à pos (peut valoir None).
Pattern.search(string[, pos[, endpos]])
>>>
>>>
Pattern.fullmatch(string[, pos[, endpos]])
>>>
Pattern.split(string, maxsplit=0)
Pattern.findall(string[, pos[, endpos]])
Pattern.finditer(string[, pos[, endpos]])
Pattern.sub(repl, string, count=0)
Pattern.subn(repl, string, count=0)
Pattern.flags
Pattern.groupindex
Pattern.pattern
Objets de correspondance
Les objets de correspondance ont toujours une valeur booléenne True.
Puisque match() et search() renvoient None quand il n'y a pas de
correspondance, vous pouvez tester s'il y a eu correspondance avec une simple
instruction if :
Match.expand(template)
Modifié dans la version 3.5: Les groupes sans correspondance sont remplacés par
une chaîne vide.
Match.group([group1, ...])
Renvoie un ou plus sous-groupes de la correspondance. Si un seul argument est
donné, le résultat est une chaîne simple ; s'il y a plusieurs arguments, le résultat est
un tuple comprenant un élément par argument. Sans arguments, group1 vaut par
défaut zéro (la correspondance entière est renvoyée). Si un argument groupN vaut
zéro, l'élément associé sera la chaîne de correspondance entière ; s'il est dans
l'intervalle fermé [1..99], c'est la correspondance avec le groupe de parenthèses
associé. Si un numéro de groupe est négatif ou supérieur au nombre de groupes
définis dans le motif, une exception indexError est levée. Si un groupe est contenu
dans une partie du motif qui n'a aucune correspondance, l'élément associé
sera None. Si un groupe est contenu dans une partie du motif qui a plusieurs
correspondances, seule la dernière correspondance est renvoyée.
>>>
>>>
Les groupes nommés peuvent aussi être référencés par leur index :
>>>
>>> m.group(1)
'Malcolm'
>>> m.group(2)
'Reynolds'
>>>
Cela est identique à m.group(g). Cela permet un accès plus facile à un groupe
individuel depuis une correspondance :
>>>
Match.groups(default=None)
Par exemple :
>>>
Si on rend la partie décimale et tout ce qui la suit optionnels, tous les groupes ne
figureront pas dans la correspondance. Ces groupes sans correspondance
vaudront None sauf si une autre valeur est donnée à l'argument default :
>>>
>>>
Match.end([group])
m.string[m.start(g):m.end(g)]
>>>
Match.pos
Match.endpos
Match.lastindex
Match.lastgroup
Le nom du dernier groupe capturant validé, ou None si le groupe n'a pas de nom, ou
si aucun groupe ne correspondait.
Match.re
Match.string
def displaymatch(match):
if match is None:
return None
return '<Match: %r, groups=%r>' % (match.group(),
match.groups())
Supposez que vous écriviez un jeu de poker où la main d'un joueur est représentée
par une chaîne de 5 caractères avec chaque caractère représentant une carte, "a"
pour l'as, "k" pour le roi (king), "q" pour la reine (queen), "j" pour le valet (jack), "t"
pour 10 (ten), et les caractères de "2" à "9" représentant les cartes avec ces valeurs.
Pour vérifier qu'une chaîne donnée est une main valide, on pourrait faire comme
suit :
>>>
>>>
>>> pair.match("354aa").group(1)
'a'
Simuler scanf()
Python n'a actuellement pas d'équivalent à la fonction C scanf(). Les expressions
rationnelles sont généralement plus puissantes, mais aussi plus verbeuses, que les
chaînes de format scanf(). Le tableau suivant présente des expressions
rationnelles plus ou moins équivalentes aux éléments de formats de scanf().
Pour extraire le nom de fichier et les nombres depuis une chaîne comme
%s - %d errors, %d warnings
L'expression rationnelle équivalente serait
Par exemple :
>>>
>>>
>>>
>>>
Les entrées sont séparées par un saut de ligne ou plus. Nous convertissons
maintenant la chaîne en une liste où chaque ligne non vide aura sa propre entrée :
Finalement, on sépare chaque entrée en une liste avec prénom, nom, numéro de
téléphone et adresse. Nous utilisons le paramètre maxsplit de split() parce que
l'adresse contient des espaces, qui sont notre motif de séparation :
>>>
>>>
>>>
>>>
>>>
import collections
import re
def tokenize(code):
keywords = {'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB',
'RETURN'}
token_specification = [
('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal
number
('ASSIGN', r':='), # Assignment operator
('END', r';'), # Statement terminator
('ID', r'[A-Za-z]+'), # Identifiers
('OP', r'[+\-*/]'), # Arithmetic operators
('NEWLINE', r'\n'), # Line endings
('SKIP', r'[ \t]+'), # Skip over spaces and
tabs
('MISMATCH', r'.'), # Any other character
]
tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in
token_specification)
line_num = 1
line_start = 0
for mo in re.finditer(tok_regex, code):
kind = mo.lastgroup
value = mo.group()
column = mo.start() - line_start
if kind == 'NUMBER':
value = float(value) if '.' in value else int(value)
elif kind == 'ID' and value in keywords:
kind = value
elif kind == 'NEWLINE':
line_start = mo.end()
line_num += 1
continue
elif kind == 'SKIP':
continue
elif kind == 'MISMATCH':
raise RuntimeError(f'{value!r} unexpected on line
{line_num}')
yield Token(kind, value, line_num, column)
statements = '''
IF quantity THEN
total := total + price * quantity;
tax := price * 0.05;
ENDIF;
'''
Friedl, Jeffrey. Mastering Regular Expressions. 3rd ed., O'Reilly Media, 2009. La
troisième édition de ce livre ne couvre plus du tout Python, mais la première version
explique en détails comment écrire de bonnes expressions rationnelles.
This module provides classes and functions for comparing sequences. It can be used
for example, for comparing files, and can produce difference information in various
formats, including HTML and context and unified diffs. For comparing directories and
files, see also, the filecmp module.
class difflib.SequenceMatcher
C'est une classe flexible permettant de comparer des séquences deux à deux de
n'importe quel type, tant que les éléments des séquences sont hachables.
L'algorithme de base est antérieur, et un peu plus sophistiqué, à un algorithme publié
à la fin des années 1980 par Ratcliff et Obershelp sous le nom hyperbolique
de gestalt pattern matching. L'idée est de trouver la plus longue sous-séquence
d'appariement contiguë qui ne contient pas d'éléments « indésirables » ; ces
éléments « indésirables » sont ceux qui sont inintéressants dans un certain sens,
comme les lignes blanches ou les espaces. (Le traitement des éléments indésirables
est une extension de l'algorithme de Ratcliff et Obershelp). La même idée est ensuite
appliquée récursivement aux morceaux des séquences à gauche et à droite de la
sous-séquence correspondante. Cela ne donne pas des séquences de montage
minimales, mais tend à donner des correspondances qui « semblent correctes » pour
les gens.
class difflib.Differ
Code Signification
'- ' ligne n'appartenant qu'à la séquence 1
'+ ' ligne n'appartenant qu'à la séquence 2
Code Signification
' ' ligne commune aux deux séquences
'? ' ligne non présente dans l'une ou l'autre des séquences d'entrée
class difflib.HtmlDiff
Cette classe peut être utilisée pour créer un tableau HTML (ou un fichier HTML
complet contenant le tableau) montrant une comparaison côte à côte, ligne par ligne,
du texte avec les changements inter-lignes et intralignes. Le tableau peut être généré
en mode de différence complet ou contextuel.
__init__(tabsize=8, wrapcolumn=None, linejunk=None, charjunk=IS_CHARACTER_J
UNK)
make_file(fromlines, tolines, fromdesc='', todesc='', context=False, numlines=5, *, char
set='utf-8')
make_table(fromlines, tolines, fromdesc='', todesc='', context=False, numlines=5)
Compare fromlines et tolines (listes de chaînes) et renvoie une chaîne qui est un
tableau HTML complet montrant les différences ligne par ligne avec les changements
inter-lignes et intralignes mis en évidence.
Les arguments pour cette méthode sont les mêmes que ceux de la
méthode make_file().
difflib.context_diff(a, b, fromfile='', tofile='', fromfiledate='', tofiledate='', n=3, lin
eterm='\n')
Context diffs are a compact way of showing just the lines that have changed plus a
few lines of context. The changes are shown in a before/after style. The number of
context lines is set by n which defaults to three.
difflib.get_close_matches(word, possibilities, n=3, cutoff=0.6)
Return a list of the best "good enough" matches. word is a sequence for which close
matches are desired (typically a string), and possibilities is a list of sequences
against which to match word (typically a list of strings).
linejunk: A function that accepts a single string argument, and returns true if the
string is junk, or false if not. The default is None. There is also a module-level
function IS_LINE_JUNK(), which filters out lines without visible characters, except
for at most one pound character ('#') -- however the
underlying SequenceMatcher class does a dynamic analysis of which lines are so
frequent as to constitute noise, and this usually works better than using this function.
charjunk: A function that accepts a character (a string of length 1), and returns if the
character is junk, or false if not. The default is module-level
function IS_CHARACTER_JUNK(), which filters out whitespace characters (a blank or
tab; it's a bad idea to include newline in this!).
Exemple :
Unified diffs are a compact way of showing just the lines that have changed plus a
few lines of context. The changes are shown in an inline style (instead of separate
before/after blocks). The number of context lines is set by n which defaults to three.
By default, the diff control lines (those with ---, +++, or @@) are created with a trailing
newline. This is helpful so that inputs created from io.IOBase.readlines() result
in diffs that are suitable for use with io.IOBase.writelines() since both the
inputs and outputs have trailing newlines.
difflib.diff_bytes(dfunc, a, b, fromfile=b'', tofile=b'', fromfiledate=b'', tofiledate=b''
, n=3, lineterm=b'\n')
Allows you to compare data with unknown or inconsistent encoding. All inputs
except n must be bytes objects, not str. Works by losslessly converting all inputs
(except n) to str, and
calling dfunc(a, b, fromfile, tofile, fromfiledate, tofiledate, n, l
ineterm). The output of dfunc is then converted back to bytes, so the delta lines
that you receive have the same unknown/inconsistent encodings as a and b.
difflib.IS_LINE_JUNK(line)
difflib.IS_CHARACTER_JUNK(ch)
Return True for ignorable characters. The character ch is ignorable if ch is a space
or tab, otherwise it is not ignorable. Used as a default for
parameter charjunk in ndiff().
Voir aussi
Pattern Matching: The Gestalt Approach
SequenceMatcher Objects
The SequenceMatcher class has this constructor:
class difflib.SequenceMatcher(isjunk=None, a='', b='', autojunk=True)
set_seq1(a)
Set the first sequence to be compared. The second sequence to be compared is not
changed.
set_seq2(b)
Set the second sequence to be compared. The first sequence to be compared is not
changed.
find_longest_match(alo, ahi, blo, bhi)
Find longest matching block in a[alo:ahi] and b[blo:bhi].
If isjunk was provided, first the longest matching block is determined as above, but
with the additional restriction that no junk element appears in the block. Then that
block is extended as far as possible by matching (only) junk elements on both sides.
So the resulting block never matches on junk except as identical junk happens to be
adjacent to an interesting match.
Here's the same example as before, but considering blanks to be junk. That
prevents ' abcd' from matching the ' abcd' at the tail end of the second
sequence directly. Instead only the 'abcd' can match, and matches the
leftmost 'abcd' in the second sequence:
get_matching_blocks()
Return list of triples describing non-overlapping matching subsequences. Each triple
is of the form (i, j, n), and means that a[i:i+n] == b[j:j+n]. The triples are
monotonically increasing in i and j.
The last triple is a dummy, and has the value (len(a), len(b), 0). It is the only
triple with n == 0. If (i, j, n) and (i', j', n') are adjacent triples in the list,
and the second is not the last triple in the list, then i+n < i' or j+n < j'; in other
words, adjacent triples always describe non-adjacent equal blocks.
Valeur Signification
'replace' a[i1:i2] should be replaced by b[j1:j2].
>>>
>>> a = "qabxcd"
>>> b = "abycdf"
>>> s = SequenceMatcher(None, a, b)
>>> for tag, i1, i2, j1, j2 in s.get_opcodes():
... print('{:7} a[{}:{}] --> b[{}:{}] {!r:>8} --> {!
r}'.format(
... tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
delete a[0:1] --> b[0:0] 'q' --> ''
equal a[1:3] --> b[0:2] 'ab' --> 'ab'
replace a[3:4] --> b[2:3] 'x' --> 'y'
equal a[4:6] --> b[3:5] 'cd' --> 'cd'
insert a[6:6] --> b[5:6] '' --> 'f'
get_grouped_opcodes(n=3)
Return a generator of groups with up to n lines of context.
Starting with the groups returned by get_opcodes(), this method splits out smaller
change clusters and eliminates intervening ranges which have no changes.
ratio()
Return a measure of the sequences' similarity as a float in the range [0, 1].
Where T is the total number of elements in both sequences, and M is the number of
matches, this is 2.0*M / T. Note that this is 1.0 if the sequences are identical,
and 0.0 if they have nothing in common.
Note
Caution: The result of a ratio() call may depend on the order of the arguments. For
instance:
>>>
>>> SequenceMatcher(None, 'tide', 'diet').ratio()
0.25
>>> SequenceMatcher(None, 'diet', 'tide').ratio()
0.5
quick_ratio()
Return an upper bound on ratio() relatively quickly.
real_quick_ratio()
Return an upper bound on ratio() very quickly.
The three methods that return the ratio of matching to total characters can give
different results due to differing levels of approximation,
although quick_ratio() and real_quick_ratio() are always at least as large
as ratio():
SequenceMatcher Examples
This example compares two strings, considering blanks to be "junk":
ratio() returns a float in [0, 1], measuring the similarity of the sequences. As a rule
of thumb, a ratio() value over 0.6 means the sequences are close matches:
If you want to know how to change the first sequence into the second,
use get_opcodes():
Differ Objects
Note that Differ-generated deltas make no claim to be minimal diffs. To the
contrary, minimal diffs are often counter-intuitive, because they synch up anywhere
possible, sometimes accidental matches 100 pages apart. Restricting synch points to
contiguous matches preserves some notion of locality, at the occasional cost of
producing a longer diff.
class difflib.Differ(linejunk=None, charjunk=None)
linejunk: A function that accepts a single string argument, and returns true if the
string is junk. The default is None, meaning that no line is considered junk.
charjunk: A function that accepts a single character argument (a string of length 1),
and returns true if the character is junk. The default is None, meaning that no
character is considered junk.
These junk-filtering functions speed up matching to find differences and do not cause
any differing lines or characters to be ignored. Read the description of
the find_longest_match() method's isjunk parameter for an explanation.
compare(a, b)
Compare two sequences of lines, and generate the delta (a sequence of lines).
Each sequence must contain individual single-line strings ending with newlines. Such
sequences can be obtained from the readlines() method of file-like objects. The
delta generated also consists of newline-terminated strings, ready to be printed as-is
via the writelines() method of a file-like object.
Differ Example
This example compares two texts. First we set up the texts, sequences of individual
single-line strings ending with newlines (such sequences can also be obtained from
the readlines() method of file-like objects):
>>> d = Differ()
Note that when instantiating a Differ object we may pass functions to filter out line
and character "junk." See the Differ() constructor for details.
#!/usr/bin/env python3
""" Command line interface to difflib.py providing diffs in four
formats:
def file_mtime(path):
t = datetime.fromtimestamp(os.stat(path).st_mtime,
timezone.utc)
return t.astimezone().isoformat()
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-c', action='store_true', default=False,
help='Produce a context format diff
(default)')
parser.add_argument('-u', action='store_true', default=False,
help='Produce a unified format diff')
parser.add_argument('-m', action='store_true', default=False,
help='Produce HTML side by side diff '
'(can use -c and -l in
conjunction)')
parser.add_argument('-n', action='store_true', default=False,
help='Produce a ndiff format diff')
parser.add_argument('-l', '--lines', type=int, default=3,
help='Set number of context lines
(default 3)')
parser.add_argument('fromfile')
parser.add_argument('tofile')
options = parser.parse_args()
n = options.lines
fromfile = options.fromfile
tofile = options.tofile
fromdate = file_mtime(fromfile)
todate = file_mtime(tofile)
with open(fromfile) as ff:
fromlines = ff.readlines()
with open(tofile) as tf:
tolines = tf.readlines()
if options.u:
diff = difflib.unified_diff(fromlines, tolines, fromfile,
tofile, fromdate, todate, n=n)
elif options.n:
diff = difflib.ndiff(fromlines, tolines)
elif options.m:
diff =
difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile,co
ntext=options.c,numlines=n)
else:
diff = difflib.context_diff(fromlines, tolines, fromfile,
tofile, fromdate, todate, n=n)
sys.stdout.writelines(diff)
if __name__ == '__main__':
main()
textwrap --- Encapsulation et
remplissage de texte
Source code: Lib/textwrap.py
textwrap.wrap(text, width=70, **kwargs)
textwrap.fill(text, width=70, **kwargs)
Formate le paragraphe unique dans text et renvoie une seule chaîne dont le contenu
est le paragraphe formaté. fill() est un raccourci pour
"\n".join(wrap(text, ...))
textwrap.shorten(text, width, **kwargs)
Tout d'abord, les espaces dans text sont réduites (toutes les espaces blancs sont
remplacées par des espaces simples). Si le résultat tient dans la width, il est
renvoyé. Sinon, suffisamment de mots sont supprimés en fin de chaîne de manière à
ce que les mots restants plus le placeholder tiennent dans width :
>>>
textwrap.dedent(text)
Ceci peut être utilisé pour aligner les chaînes à trois guillemets avec le bord gauche
de l'affichage, tout en les présentant sous forme indentée dans le code source.
Notez que les tabulations et les espaces sont traitées comme des espaces, mais
qu'elles ne sont pas égales : les lignes " hello" et "\thello" sont considérées
comme n'ayant pas d'espaces de tête communes.
Lines containing only whitespace are ignored in the input and normalized to a single
newline character in the output.
Par exemple :
def test():
# end first line with \ to avoid the empty line!
s = '''\
hello
world
'''
print(repr(s)) # prints ' hello\n world\n
'
print(repr(dedent(s))) # prints 'hello\n world\n'
textwrap.indent(text, prefix, predicate=None)
Par défaut, prefix est ajouté à toutes les lignes qui ne sont pas constituées
uniquement d'espaces (y compris les fins de ligne).
Par exemple :
>>>
>>>
Le formatage du texte s'effectue en priorité sur les espaces puis juste après les traits
d'union dans des mots séparés par des traits d'union ; ce n'est qu'alors que les mots
longs seront cassés si nécessaire, à moins
que TextWrapper.break_long_words soit défini sur False.
class textwrap.TextWrapper(**kwargs)
est identique à
wrapper = TextWrapper()
wrapper.initial_indent = "* "
width
(par défaut : 70`) Longueur maximale des lignes reformatées. Tant qu'il n'y a pas de
mots individuels dans le texte d'entrée plus longs que width, TextWrapper garantit
qu'aucune ligne de sortie n'est plus longue que width caractères.
expand_tabs
(par défaut : True) Si true, alors tous les caractères de tabulation dans text sont
transformés en espaces en utilisant la méthode expandtabs() de text.
tabsize
(par défaut : 8) Si expand_tabs est true, alors tous les caractères de tabulation
dans text sont transformés en zéro ou plus d'espaces, selon la colonne courante et la
taille de tabulation donnée.
Nouveau dans la version 3.3.
replace_whitespace
(par défaut : True) Si true, après l'expansion des tabulations mais avant le
formatage, la méthode wrap() remplace chaque blanc par une espace unique.
Les blancs remplacés sont les suivants : tabulation, nouvelle ligne, tabulation
verticale, saut de page et retour chariot ('\t\n\v\f\r').
Note
initial_indent
(par défaut : `''`) Chaîne qui est ajoutée à la première ligne de la sortie formatée.
Elle compte pour le calcul de la longueur de la première ligne. La chaîne vide n'est
pas indentée.
subsequent_indent
(par défaut : `''`) Chaîne qui préfixe toutes les lignes de la sortie formatée sauf la
première. Elle compte pour le calcul de la longueur de chaque ligne à l'exception de
la première.
fix_sentence_endings
(par défaut : Faux) Si true, TextWrapper tente de détecter les fins de phrases et de
s'assurer que les phrases sont toujours séparées par exactement deux espaces.
Ceci est généralement souhaité pour un texte en police à chasse fixe. Cependant,
l'algorithme de détection de phrase est imparfait : il suppose qu'une fin de phrase
consiste en une lettre minuscule suivie de l'une des lettres suivantes : '.', '!',
ou '?', éventuellement suivie d'une des lettres '"' ou "'", suivie par une espace.
Un problème avec cet algorithme est qu'il est incapable de détecter la différence
entre "Dr" dans
et "Spot." dans
fix_sentence_endings est False par défaut.
break_long_words
(par défaut : True) Si True, alors les mots plus longs que width sont cassés afin de
s'assurer qu'aucune ligne ne soit plus longue que width. Si c'est False, les mots
longs ne sont pas cassés et certaines lignes peuvent être plus longues
que width (les mots longs seront mis sur une ligne qui leur est propre, afin de
minimiser le dépassement de width).
break_on_hyphens
(par défaut : True) Si c'est vrai, le formatage se fait de préférence sur les espaces et
juste après sur les traits d'union des mots composés, comme il est d'usage en
anglais. Si False, seuls les espaces sont considérées comme de bons endroits pour
les sauts de ligne, mais vous devez définir break_long_words à False si vous
voulez des mots vraiment insécables. Le comportement par défaut dans les versions
précédentes était de toujours permettre de couper les mots avec trait d'union.
max_lines
(par défaut : None`) Si ce n'est pas None`, alors la sortie contient au
maximum max_lines lignes, avec placeholder à la fin de la sortie.
wrap(text)
Formate le paragraphe unique dans text (une chaîne de caractères) de sorte que
chaque ligne ait au maximum width caractères. Toutes les options de formatage
sont tirées des attributs d'instance de l'instance de classe TextWrapper. Renvoie
une liste de lignes de sortie, sans nouvelles lignes finales. Si la sortie formatée n'a
pas de contenu, la liste vide est renvoyée.
fill(text)
Formate le paragraphe unique de text et renvoie une seule chaîne contenant le
paragraphe formaté.
The module uses the same names and symbols as defined by Unicode Standard
Annex #44, "Unicode Character Database". It defines the following functions:
unicodedata.lookup(name)
Retrouver un caractère par nom. Si un caractère avec le nom donné est trouvé,
renvoyer le caractère correspondant. S'il n'est pas trouvé, KeyError est levée.
Modifié dans la version 3.3: La gestion des alias 1 et des séquences nommées 2 a
été ajouté.
unicodedata.name(chr[, default])
unicodedata.decimal(chr[, default])
unicodedata.digit(chr[, default])
unicodedata.numeric(chr[, default])
unicodedata.category(chr)
unicodedata.bidirectional(chr)
unicodedata.combining(chr)
unicodedata.east_asian_width(chr)
Renvoie la largeur est-asiatique assignée à un caractère chr comme une chaîne de
caractères.
unicodedata.mirrored(chr)
unicodedata.decomposition(chr)
unicodedata.normalize(form, unistr)
En plus de ces deux formes, il existe deux formes nominales basées sur
l'équivalence de compatibilité. En Unicode, certains caractères sont gérés alors qu'ils
sont normalement unifiés avec d'autres caractères. Par exemple, U+2160 (ROMAN
NUMERAL ONE) est vraiment la même chose que U+0049 (LATIN CAPITAL
LETTER I). Cependant, ce caractère est supporté par souci de compatibilité avec les
jeux de caractères existants (par exemple gb2312).
unicodedata.unidata_version
unicodedata.ucd_3_2_0
Ceci est un objet qui a les mêmes méthodes que le module, mais qui utilise la
version 3.2 de la base de données Unicode, pour les applications qui nécessitent
cette version spécifique de la base de données Unicode (comme l'IDNA).
Exemples :
Notes
http://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt
http://www.unicode.org/Public/11.0.0/ucd/NamedSequences.txt
stringprep — Préparation des chaines
de caractères internet
Code source : Lib/stringprep.py
Nommer les différentes choses d'internet (comme les hôtes) amène souvent au
besoin de comparer ces identifiants, ce qui nécessite un critère d'« égalité ». La
manière dont cette comparaison est effectuée dépend du domaine d'application,
c'est-à-dire si elle doit être sensible à la casse ou non. Il peut être aussi nécessaire
de restreindre les identifiants possibles, pour permettre uniquement les identifiants
composés de caractères « imprimables ».
As a result, these tables are exposed as functions, not as data structures. There are
two kinds of tables in the RFC: sets and mappings. For a set, stringprep provides
the "characteristic function", i.e. a function that returns True if the parameter is part
of the set. For mappings, it provides the mapping function: given the key, it returns
the associated value. Below is a list of all functions available in the module.
stringprep.in_table_a1(code)
Détermine si le code est en table A.1 (points de code non-assigné dans Unicode
3.2).
stringprep.in_table_b1(code)
Détermine si le code est en table B.1 (habituellement mis en correspondance avec
rien).
stringprep.map_table_b2(code)
stringprep.map_table_b3(code)
stringprep.in_table_c11(code)
stringprep.in_table_c12(code)
Détermine si le code est dans la table C.1.2 (caractères d'espacement non ASCII).
stringprep.in_table_c11_c12(code)
Détermine si le code est dans la table C.1 (caractères d'espacement, union de C.1.1
et C.1.2).
stringprep.in_table_c21(code)
stringprep.in_table_c22(code)
stringprep.in_table_c21_c22(code)
Détermine si le code est dans la table C.2 (caractères de contrôle, union de C.2.1 et
C.2.2).
stringprep.in_table_c3(code)
stringprep.in_table_c4(code)
stringprep.in_table_c6(code)
Détermine si le code est dans la table C.6 (Inapproprié pour texte brut).
stringprep.in_table_c7(code)
stringprep.in_table_c8(code)
Détermine si le code est dans la table C.8 (change de propriétés d'affichage ou sont
obsolètes).
stringprep.in_table_c9(code)
stringprep.in_table_d1(code)
Détermine si le code est en table D.1 (caractères avec propriété bidirectionnelle "R"
ou "AL").
stringprep.in_table_d2(code)
Détermine si le code est dans la table D.2 (caractères avec propriété bidirectionnelle
"L").
Note
Fichier d'initialisation
Les fonctions suivantes se rapportent au fichier d'initialisation et à la configuration
utilisateur.
readline.parse_and_bind(string)
readline.read_init_file([filename])
readline.get_line_buffer()
readline.insert_text(string)
readline.redisplay()
Change ce qui est affiché sur l'écran pour représenter le contenu courant de la ligne
de tampon. Cela appelle la fonction rl_redisplay() dans la bibliothèque sous-
jacente.
Fichier d'historique
les fonctions suivantes opèrent sur un fichier d'historique :
readline.read_history_file([filename])
readline.write_history_file([filename])
readline.append_history_file(nelements[, filename])
readline.set_history_length(length)
Liste d'historique
Les fonctions suivantes opèrent sur une liste d'historique globale :
readline.clear_history()
readline.get_current_history_length()
readline.get_history_item(index)
readline.remove_history_item(pos)
readline.replace_history_item(pos, line)
readline.add_history(line)
Ajoute line au tampon d'historique, comme si c'était la dernière ligne saisie. Cela
appelle la fonction add_history() de la libraire sous-jacente.
readline.set_auto_history(enabled)
readline.set_pre_input_hook([function])
Complétion
Les fonctions suivantes relatent comment implémenter une fonction de complétion
d'un mot spécifique. C'est typiquement déclenché par la touche Tab, et peut
suggérer et automatiquement compléter un mot en cours de saisie. Par défaut,
Readline est configuré pour être utilisé par rlcompleter pour compléter les mots
clefs de Python pour l'interpréteur interactif. Si le module readline doit être utilisé
avec une complétion spécifique, un ensemble de mots délimiteurs doivent être
définis.
readline.set_completer([function])
readline.get_completer()
readline.get_completion_type()
readline.get_begidx()
readline.get_endidx()
Récupère l'indexe de début ou de fin d'un contexte de complétion. Ces indexes sont
les arguments start et end passés à la fonction de
retour rl_attempted_completion_function de la bibliothèque sous-jacente.
readline.set_completer_delims(string)
readline.get_completer_delims()
readline.set_completion_display_matches_hook([function])
Exemple
L'exemple suivant démontre comment utiliser les fonctions de lecture et d'écriture de
l'historique du module readline pour charger ou sauvegarder automatiquement un
fichier d'historique nommé .python_history depuis le répertoire d’accueil de
l’utilisateur. Le code ci-dessous doit normalement être exécuté automatiquement
durant une session interactive depuis le fichier de l'utilisateur PYTHONSTARTUP.
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"),
".python_history")
try:
readline.read_history_file(histfile)
# default history len is -1 (infinite), which may grow unruly
readline.set_history_length(1000)
except FileNotFoundError:
pass
atexit.register(readline.write_history_file, histfile)
L'exemple suivant atteint le même objectif mais gère des sessions interactives
concurrentes, en ajoutant seulement le nouvel historique.
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"),
".python_history")
try:
readline.read_history_file(histfile)
h_len = readline.get_current_history_length()
except FileNotFoundError:
open(histfile, 'wb').close()
h_len = 0
import atexit
import code
import os
import readline
class HistoryConsole(code.InteractiveConsole):
def __init__(self, locals=None, filename="<console>",
histfile=os.path.expanduser("~/.console-
history")):
code.InteractiveConsole.__init__(self, locals, filename)
self.init_history(histfile)
Exemple :
>>>
Completer.complete(text, state)
Si text ne contient pas un caractère point ( '.'), il puise dans les noms actuellement
définis dans __main__, builtins ainsi que les mots-clés (ainsi que définis par le
module keyword)
Quand elle est appelée pour un nom qui comporte un point, elle ne tente d'évaluer
que ce qui n'a pas d'effet secondaire (les fonctions ne sont pas évaluées, mais elle
peut faire des appels à __getattr__()), jusqu'à la dernière partie, et trouve des
équivalents pour le reste via la fonction dir(). Toute exception levée durant
l'évaluation de l'expression est interceptée, mise sous silence, et None est renvoyé.
Ce module effectue des conversions entre des valeurs Python et des structures C
représentées sous la forme de bytes (séquences d'octets) Python. Cela permet,
entre autres, de manipuler des données agrégées sous forme binaire dans des
fichiers ou à travers des connecteurs réseau. Il utilise Chaînes de spécification du
format comme description de l'agencement des structures afin de réaliser les
conversions depuis et vers les valeurs Python.
Note
par défaut, le résultat de l'agrégation d'une structure C donnée comprend des octets
de bourrage afin de maintenir un alignement correct des types C sous-jacents ; de la
même manière, l'alignement est pris en compte lors de la dissociation. Ce
comportement a été choisi de manière à ce que les octets d'une structure agrégée
reproduisent exactement l'agencement en mémoire de la structure C équivalente.
Pour gérer des formats de données indépendants de la plateforme ou omettre les
octets implicites de bourrage, utilisez la taille et l'alignement standard en lieu et
place de la taille et l'alignement native (voir Boutisme, taille et alignement pour les
détails).
Plusieurs fonctions de struct (et méthodes de Struct) prennent un
argument buffer. Cet argument fait référence à des objets qui
implémentent Protocole tampon et qui proposent un tampon soit en lecture seule,
soit en lecture-écriture. Les types les plus courants qui utilisent cette fonctionnalité
sont bytes et bytearray, mais beaucoup d'autres types qui peuvent être
considérés comme des tableaux d'octets implémentent le protocole tampon ; ils
peuvent ainsi être lus ou remplis depuis un objet bytes sans faire de copie.
Fonctions et exceptions
Le module définit les exceptions et fonctions suivantes :
exception struct.error
Exception levée à plusieurs occasions ; l'argument est une chaîne qui décrit ce qui
ne va pas.
struct.pack(format, v1, v2, ...)
struct.pack_into(format, buffer, offset, v1, v2, ...)
struct.unpack(format, buffer)
struct.unpack_from(format, buffer, offset=0)
Chaque itération produit un n-uplet tel que spécifié par la chaîne de format.
struct.calcsize(format)
Cependant, le premier caractère de la chaîne de format peut être utilisé pour indiquer
le boutisme, la taille et l'alignement des données agrégées, conformément à la table
suivante :
Caractèr
Boutisme Taille Alignement
e
@ natif natif natif
= natif standard aucun
< petit-boutiste standard aucun
> gros-boutiste standard aucun
Caractèr
Boutisme Taille Alignement
e
réseau (= gros-
! standard aucun
boutiste)
Si le premier caractère n'est pas dans cette liste, le module se comporte comme
si '@' avait été indiqué.
Notez la différence entre '@' et '=' : les deux utilisent le boutisme natif mais la taille
et l'alignement du dernier sont standards.
Notes :
Taille
Form Type Not
Type C standa
at Python es
rd
pas de
x octet de bourrage
valeur
bytes (suite
c char d'octets) de 1
taille 1
(1),
b signed char int (entier) 1
(2)
B unsigned char int (entier) 1 (2)
bool (boolé
? _Bool 1 (1)
en)
h short int (entier) 2 (2)
unsigned shor
H int (entier) 2 (2)
t
float (nomb
e (6) re à virgule 2 (4)
flottante)
float (nomb
f float re à virgule 4 (4)
flottante)
float (nomb
d double re à virgule 8 (4)
flottante)
bytes (séqu
s char[] ence
d'octets)
bytes (séqu
p char[] ence
d'octets)
Notes :
Lors de l'agrégation d'une valeur x en utilisant l'un des formats pour les entiers
('b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q'), si x est en dehors de l'intervalle
du format spécifié, une struct.error est levée.
Modifié dans la version 3.1: auparavant, certains formats d'entiers absorbaient les
valeurs en dehors des intervalles valides et levaient une DeprecationWarning au
lieu d'une struct.error.
Exemples
Note
tous les exemples présentés supposent que l'on utilise le boutisme, la taille et
l'alignement natifs sur une machine gros-boutiste.
>>>
Les champs dissociés peuvent être nommés en leur assignant des variables ou en
encapsulant le résultat dans un n-uplet nommé :
>>>
>>> record = b'raymond \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb',
record)
L'ordre des caractères de format peut avoir un impact sur la taille puisque le
bourrage nécessaire pour réaliser l'alignement est différent :
>>>
>>>
>>> pack('llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
Ceci ne fonctionne que quand la taille et l'alignement natifs sont utilisés ; la taille et
l'alignement standards ne forcent aucun alignement.
Voir aussi
Module array
Classes
Le module struct définit aussi le type suivant :
class struct.Struct(format)
Renvoie un nouvel objet Struct qui écrit et lit des données binaires conformément à
la chaîne de format format. Créer une fois pour toutes un objet Struct puis appeler
ses méthodes est plus efficace que d'appeler les fonctions de struct avec le même
format puisque la chaîne de format n'est compilée qu'une seule fois.
Note
les versions compilées des dernières chaînes de format passées à Struct et aux
fonctions de niveau module sont mises en cache, de manière à ce que les
programmes qui n'utilisent que quelques chaînes de format n'aient pas à se
préoccuper de n'utiliser qu'une seule instance de Struct.
pack(v1, v2, ...)
Identique à la fonction pack(), en utilisant le format compilé
(len(result) vaut size).
pack_into(buffer, offset, v1, v2, ...)
Identique à la fonction pack_into(), en utilisant le format compilé.
unpack(buffer)
Identique à la fonction unpack(), en utilisant le format compilé. La taille du
tampon buffer en octets doit valoir size.
unpack_from(buffer, offset=0)
Identical to the unpack_from() function, using the compiled format. The buffer's
size in bytes, minus offset, must be at least size.
iter_unpack(buffer)
Identique à la fonction iter_unpack(), en utilisant le format compilé. La taille du
tampon buffer en octets doit être un multiple de size.
format
La chaîne de format utilisée pour construire l'objet Struct.
Modifié dans la version 3.7: la chaîne de format est maintenant de type str au lieu
de bytes.
size
La taille calculée de la structure agrégée (et donc de l'objet bytes produit par la
méthode pack()) correspondante à format.
Ce module définit les classes de base pour les codecs (encodeurs et décodeurs)
standards Python et fournit l'interface avec le registre des codecs internes à Python,
qui gère le processus de recherche de codecs et de gestion des erreurs. La plupart
des codecs sont des encodeurs de texte, qui encode du texte vers des séquences
d'octets (type bytes de Python) mais il existe aussi des codecs qui encodent du texte
vers du texte et des bytes vers des bytes. Les codecs personnalisés peuvent
encoder et décoder des types arbitraires, mais l'utilisation de certaines
fonctionnalités du module est restreinte aux encodeurs de texte ou aux codecs qui
encodent vers bytes.
codecs.encode(obj, encoding='utf-8', errors='strict')
codecs.decode(obj, encoding='utf-8', errors='strict')
Décode obj en utilisant le codec enregistré pour encoding.
codecs.lookup(encoding)
Recherche les informations relatives au codec dans le registre des codecs de Python
et renvoie l'objet CodecInfo tel que défini ci-dessous.
Les encodeurs sont recherchés en priorité dans le cache du registre. S'ils n'y sont
pas, la liste des fonctions de recherche enregistrées est passée en revue. Si aucun
objet CodecInfo n'est trouvé, une LookupError est levée. Sinon,
l'objet CodecInfo est mis en cache et renvoyé vers l'appelant.
class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, i
ncrementalencoder=None, incrementaldecoder=None, name=None)
Les détails d'un codec trouvé dans le registre des codecs. Les arguments du
constructeur sont stockés dans les attributs éponymes :
name
Le nom de l'encodeur.
encode
decode
Les fonctions d'encodage et de décodage. Ces fonctions ou méthodes doivent avoir
la même interface que les méthodes encode() et decode() des instances de
Codec (voir Interface des codecs). Les fonctions et méthodes sont censées
fonctionner sans état interne.
incrementalencoder
incrementaldecoder
Classes d'encodeurs et de décodeurs incrémentaux ou fonctions usines. Elles
doivent avoir respectivement les mêmes interfaces que celles définies par les
classes de base IncrementalEncoder et IncrementalDecoder. Les codecs
incrémentaux peuvent conserver des états internes.
streamwriter
streamreader
Classes d'écriture et de lecture de flux ou fonctions usines. Elles doivent avoir les
mêmes interfaces que celles définies par les classes de
base StreamWriter et StreamReader, respectivement. Les codecs de flux peuvent
conserver un état interne.
Pour simplifier l'accès aux différents composants du codec, le module fournit les
fonctions supplémentaires suivantes qui utilisent lookup() pour la recherche du
codec :
codecs.getencoder(encoding)
codecs.getdecoder(encoding)
codecs.getincrementalencoder(encoding)
codecs.getincrementaldecoder(encoding)
codecs.getreader(encoding)
Recherche le codec pour l'encodage encoding et renvoie sa
classe StreamReader ou la fonction usine.
codecs.getwriter(encoding)
codecs.register(search_function)
Note
codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=1)
Note
les fichiers encodés sous-jacents sont toujours ouverts en mode binaire. Aucune
conversion automatique de '\n' n'est effectuée à la lecture ou à l'écriture.
L'argument mode peut être n'importe quel mode binaire acceptable pour la fonction
native open() ; le 'b' est automatiquement ajouté.
errors peut être spécifié pour définir la gestion des erreurs. La valeur par défaut
est 'strict', ce qui lève une ValueError en cas d'erreur lors du codage.
codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')
errors peut être spécifié pour définir la gestion des erreurs. La valeur par défaut
est 'strict', ce qui lève une ValueError en cas d'erreur lors du codage.
codecs.iterencode(iterator, encoding, errors='strict', **kwargs)
Cette fonction nécessite que le codec accepte les objets texte (classe str) en
entrée. Par conséquent, il ne prend pas en charge les
encodeurs bytes vers bytes tels que base64_codec.
codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)
Utilise un décodeur incrémental pour décoder de manière itérative l'entrée fournie
par iterator. Cette fonction est un générateur. L'argument errors (ainsi que tout autre
argument passé par mot-clé) est transmis au décodeur incrémental.
Cette fonction requiert que le codec accepte les objets bytes en entrée. Par
conséquent, elle ne prend pas en charge les encodeurs de texte vers texte tels
que rot_13, bien que rot_13 puisse être utilisé de manière équivalente
avec iterencode().
Le module fournit également les constantes suivantes qui sont utiles pour lire et
écrire les fichiers dépendants de la plateforme :
codecs.BOM
codecs.BOM_BE
codecs.BOM_LE
codecs.BOM_UTF8
codecs.BOM_UTF16
codecs.BOM_UTF16_BE
codecs.BOM_UTF16_LE
codecs.BOM_UTF32
codecs.BOM_UTF32_BE
codecs.BOM_UTF32_LE
Gestionnaires d'erreurs
To simplify and standardize error handling, codecs may implement different error
handling schemes by accepting the errors string argument. The following string
values are defined and implemented by all standard Python codecs:
Val Significa
eur tion
Raise Un
icodeEr
ror (or a
subclass);
's
this is the
tr
default.
ic
Impleme
t'
nted
in stric
t_error
s().
Ignore
the
malforme
d data
and
'i continue
gn without
or further
e' notice.
Impleme
nted
in ignor
e_error
s().
Les gestionnaires d'erreurs suivants ne s'appliquent que pour les encodeurs de
texte :
Vale Signific
ur ation
Replace
with a
suitable
replace
ment
marker;
Python
will use
the
official
U+FFFD
REPLA
CEME
NT
're CHAR
pla ACTER
ce' for the
built-in
codecs
on
decodin
g, and
'?' on
encodin
g.
Implem
ented
in repl
ace_er
rors()
.
'xm Replace
lch with the
arr appropri
efr ate
Vale Signific
ur ation
XML
characte
r
referenc
e (only
for
epl encodin
ace g).
' Implem
ented
in xmlc
harref
replac
e_erro
rs().
Rempla
ce avec
une
séquenc
e
échappé
'ba
e par
cks
des
las
antislas
hre
hs.
pla
Implém
ce'
enté
dans ba
ckslas
hrepla
ce_err
ors().
'na Replace
mer with \N
epl {...}
ace escape
' sequenc
Vale Signific
ur ation
es (only
for
encodin
g).
Implem
ented
in name
replac
e_erro
rs().
'su On
rro decodin
gat g,
ees replace
cap byte
e' with
individu
al
surrogat
e code
ranging
from U+
DC80 to
U+DCFF
. This
code
will
then be
turned
back
into the
same
byte
when
the 'su
rrogat
eescap
e' error
Vale Signific
ur ation
handler
is used
when
encodin
g the
data.
(See PE
P
383 for
more.)
C
Sig
o
Vale nifi
d
ur cat
e
ion
cs
'sur ut All
roga f- ow
tepa 8, enc
ss' ut odi
f- ng
1 and
6, dec
ut odi
f- ng
3 of
2, sur
ut rog
f- ate
1 cod
6- es.
b Th
e, ese
ut cod
f- ecs
1 nor
C
Sig
o
Vale nifi
d
ur cat
e
ion
cs
mal
6- ly
le trea
, t
ut the
f- pre
3 sen
2- ce
b of
e, sur
ut rog
f- ate
3 s as
2- an
le err
or.
codecs.register_error(name, error_handler)
Previously registered error handlers (including the standard error handlers) can be
looked up by name:
codecs.lookup_error(name)
The following standard error handlers are also made available as module level
functions:
codecs.strict_errors(exception)
codecs.replace_errors(exception)
codecs.ignore_errors(exception)
codecs.backslashreplace_errors(exception)
codecs.namereplace_errors(exception)
Codec.encode(input[, errors])
Encodes the object input and returns a tuple (output object, length consumed). For
instance, text encoding converts a string object to a bytes object using a particular
character set encoding (e.g., cp1252 or iso-8859-1).
The encoder must be able to handle zero length input and return an empty object of
the output object type in this situation.
Codec.decode(input[, errors])
Decodes the object input and returns a tuple (output object, length consumed). For
instance, for a text encoding, decoding converts a bytes object encoded using a
particular character set encoding to a string object.
For text encodings and bytes-to-bytes codecs, input must be a bytes object or one
which provides the read-only buffer interface -- for example, buffer objects and
memory mapped files.
The decoder must be able to handle zero length input and return an empty object of
the output object type in this situation.
IncrementalEncoder Objects
class codecs.IncrementalEncoder(errors='strict')
All incremental encoders must provide this constructor interface. They are free to add
additional keyword arguments, but only the ones defined here are used by the
Python codec registry.
encode(object[, final])
Encodes object (taking the current state of the encoder into account) and returns the
resulting encoded object. If this is the last call to encode() final must be true (the
default is false).
reset()
Reset the encoder to the initial state. The output is discarded:
call .encode(object, final=True), passing an empty byte or text string if
necessary, to reset the encoder and to get the output.
getstate()
Return the current state of the encoder which must be an integer. The
implementation should make sure that 0 is the most common state. (States that are
more complicated than integers can be converted into an integer by
marshaling/pickling the state and encoding the bytes of the resulting string into an
integer.)
setstate(state)
Set the state of the encoder to state. state must be an encoder state returned
by getstate().
IncrementalDecoder Objects
class codecs.IncrementalDecoder(errors='strict')
All incremental decoders must provide this constructor interface. They are free to add
additional keyword arguments, but only the ones defined here are used by the
Python codec registry.
The IncrementalDecoder may implement different error handling schemes by
providing the errors keyword argument. See Gestionnaires d'erreurs for possible
values.
decode(object[, final])
Decodes object (taking the current state of the decoder into account) and returns the
resulting decoded object. If this is the last call to decode() final must be true (the
default is false). If final is true the decoder must decode the input completely and
must flush all buffers. If this isn't possible (e.g. because of incomplete byte
sequences at the end of the input) it must initiate error handling just like in the
stateless case (which might raise an exception).
reset()
Reset the decoder to the initial state.
getstate()
Return the current state of the decoder. This must be a tuple with two items, the first
must be the buffer containing the still undecoded input. The second must be an
integer and can be additional state info. (The implementation should make sure
that 0 is the most common additional state info.) If this additional state info is 0 it
must be possible to set the decoder to the state which has no input buffered and 0 as
the additional state info, so that feeding the previously buffered input to the decoder
returns it to the previous state without producing any output. (Additional state info
that is more complicated than integers can be converted into an integer by
marshaling/pickling the info and encoding the bytes of the resulting string into an
integer.)
setstate(state)
Set the state of the decoder to state. state must be a decoder state returned
by getstate().
class codecs.StreamWriter(stream, errors='strict')
All stream writers must provide this constructor interface. They are free to add
additional keyword arguments, but only the ones defined here are used by the
Python codec registry.
The stream argument must be a file-like object open for writing text or binary data, as
appropriate for the specific codec.
write(object)
Writes the object's contents encoded to the stream.
writelines(list)
Writes the concatenated list of strings to the stream (possibly by reusing
the write() method). The standard bytes-to-bytes codecs do not support this
method.
reset()
Flushes and resets the codec buffers used for keeping state.
Calling this method should ensure that the data on the output is put into a clean state
that allows appending of new fresh data without having to rescan the whole stream to
recover state.
class codecs.StreamReader(stream, errors='strict')
All stream readers must provide this constructor interface. They are free to add
additional keyword arguments, but only the ones defined here are used by the
Python codec registry.
The stream argument must be a file-like object open for reading text or binary data,
as appropriate for the specific codec.
read([size[, chars[, firstline]]])
Decodes data from the stream and returns the resulting object.
The firstline flag indicates that it would be sufficient to only return the first line, if there
are decoding errors on later lines.
The method should use a greedy read strategy meaning that it should read as much
data as is allowed within the definition of the encoding and the given size, e.g. if
optional encoding endings or state markers are available on the stream, these should
be read too.
readline([size[, keepends]])
Read one line from the input stream and return the decoded data.
readlines([sizehint[, keepends]])
Read all lines available on the input stream and return them as a list of lines.
reset()
Resets the codec buffers used for keeping state.
Note that no stream repositioning should take place. This method is primarily
intended to be able to recover from decoding errors.
StreamReaderWriter Objects
The design is such that one can use the factory functions returned by
the lookup() function to construct the instance.
class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict')
StreamRecoder Objects
The design is such that one can use the factory functions returned by
the lookup() function to construct the instance.
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='stri
ct')
You can use these objects to do transparent transcodings, e.g., from Latin-1 to UTF-
8 and back.
Error handling is done in the same way as defined for the stream readers and writers.
There's another group of encodings (the so called charmap encodings) that choose a
different subset of all Unicode code points and how these code points are mapped to
the bytes 0x0--0xff. To see how this is done simply open
e.g. encodings/cp1252.py (which is an encoding that is used primarily on
Windows). There's a string constant with 256 characters that shows you which
character is mapped to which byte value.
All of these encodings can only encode 256 of the 1114112 code points defined in
Unicode. A simple and straightforward way that can store each Unicode code point,
is to store each code point as four consecutive bytes. There are two possibilities:
store the bytes in big endian or in little endian order. These two encodings are
called UTF-32-BE and UTF-32-LE respectively. Their disadvantage is that if e.g. you
use UTF-32-BE on a little endian machine you will always have to swap bytes on
encoding and decoding. UTF-32 avoids this problem: bytes will always be in natural
endianness. When these bytes are read by a CPU with a different endianness, then
bytes have to be swapped though. To be able to detect the endianness of a UTF-
16 or UTF-32 byte sequence, there's the so called BOM ("Byte Order Mark"). This is
the Unicode character U+FEFF. This character can be prepended to every UTF-
16 or UTF-32 byte sequence. The byte swapped version of this character ( 0xFFFE)
is an illegal character that may not appear in a Unicode text. So when the first
character in an UTF-16 or UTF-32 byte sequence appears to be a U+FFFE the bytes
have to be swapped on decoding. Unfortunately the character U+FEFF had a second
purpose as a ZERO WIDTH NO-BREAK SPACE: a character that has no width and
doesn't allow a word to be split. It can e.g. be used to give hints to a ligature
algorithm. With Unicode 4.0 using U+FEFF as a ZERO WIDTH NO-BREAK SPACE has
been deprecated (with U+2060 (WORD JOINER) assuming this role). Nevertheless
Unicode software still must be able to handle U+FEFF in both roles: as a BOM it's a
device to determine the storage layout of the encoded bytes, and vanishes once the
byte sequence has been decoded into a string; as a ZERO WIDTH NO-
BREAK SPACE it's a normal character that will be decoded like any other.
There's another encoding that is able to encoding the full range of Unicode
characters: UTF-8. UTF-8 is an 8-bit encoding, which means there are no issues with
byte order in UTF-8. Each byte in a UTF-8 byte sequence consists of two parts:
marker bits (the most significant bits) and payload bits. The marker bits are a
sequence of zero to four 1 bits followed by a 0 bit. Unicode characters are encoded
like this (with x being payload bits, which when concatenated give the Unicode
character):
The least significant bit of the Unicode character is the rightmost x bit.
Without external information it's impossible to reliably determine which encoding was
used for encoding a string. Each charmap encoding can decode any random byte
sequence. However that's not possible with UTF-8, as UTF-8 byte sequences have a
structure that doesn't allow arbitrary byte sequences. To increase the reliability with
which a UTF-8 encoding can be detected, Microsoft invented a variant of UTF-8 (that
Python 2.5 calls "utf-8-sig") for its Notepad program: Before any of the Unicode
characters is written to the file, a UTF-8 encoded BOM (which looks like this as a
byte sequence: 0xef, 0xbb, 0xbf) is written. As it's rather improbable that any
charmap encoded file starts with these byte values (which would e.g. map to
LATIN SMALL LETTER I WITH DIAERESIS
Standard Encodings
Python comes with a number of codecs built-in, either implemented as C functions or
with dictionaries as mapping tables. The following table lists the codecs by name,
together with a few common aliases, and the languages for which the encoding is
likely used. Neither the list of aliases nor the list of languages is meant to be
exhaustive. Notice that spelling alternatives that only differ in case or use a hyphen
instead of an underscore are also valid aliases; therefore, e.g. 'utf-8' is a valid
alias for the 'utf_8' codec.
Many of the character sets support the same languages. They vary in individual
characters (e.g. whether the EURO SIGN is supported or not), and in the assignment
of characters to code positions. For the European languages in particular, the
following variants typically exist:
Text Encodings
The following codecs provide str to bytes encoding and bytes-like
object to str decoding, similar to the Unicode text encodings.
Binary Transforms
The following codecs provide binary transforms: bytes-like object to bytes mappings.
They are not supported by bytes.decode() (which only produces str output).
1
Modifié dans la version 3.4: Restoration of the aliases for the binary transforms.
Text Transforms
The following codec provides a text transform: a str to str mapping. It is not
supported by str.encode() (which only produces bytes output).
Nouveau dans la version 3.2: Restoration of the rot_13 text transform.
encodings.idna.nameprep(label)
encodings.idna.ToASCII(label)
encodings.idna.ToUnicode(label)
Un objet naïf ne comporte pas assez d'informations pour se situer sans ambiguïté
par rapport à d'autres objets date/time. Le fait qu'un objet naïf représente un Temps
universel coordonné (UTC), une heure locale ou une heure dans un autre fuseau
horaire dépend complètement du programme, tout comme un nombre peut
représenter une longueur, un poids ou une distance pour le programme. Les objets
naïfs sont simples à comprendre et il est aisé de travailler avec, au prix de négliger
certains aspects de la réalité.
datetime.MINYEAR
datetime.MAXYEAR
Voir aussi
Module calendar
Une date naïve idéalisée, en supposant que le calendrier Grégorien actuel a toujours
existé et qu'il existera toujours. Attributs : year, month et day.
class datetime.time
class datetime.datetime
class datetime.timedelta
class datetime.tzinfo
Une classe de base abstraite pour les objets portants des informations sur les
fuseaux horaires. Ceux-ci sont utilisés par les classes datetime et time pour
donner une notion personnalisable d'ajustement d'horaire (par exemple la prise en
compte d'un fuseau horaire et/ou de l'heure d'été).
class datetime.timezone
Une classe qui implémente la classe de base abstraite tzinfo en tant qu'offset fixe
par rapport au temps UTC.
object
timedelta
tzinfo
timezone
time
date
datetime
Objets timedelta
Un objet timedelta représente une durée, c'est-à-dire la différence entre deux
dates ou heures.
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, mi
nutes=0, hours=0, weeks=0)
Tous les paramètres sont optionnels et ont 0 comme valeur par défaut. Les
paramètres peuvent être des entiers ou des flottants et ils peuvent être positifs ou
négatifs.
0 <= microseconds < 1000000
0 <= secondes < 3600*24 (le nombre de secondes dans une journée)
-999999999 <= days <= 999999999
Si l'un des arguments est un flottant et qu'il y a des microsecondes décimales, les
microsecondes décimales laissées par les arguments sont combinées et leur somme
est arrondie à la microseconde la plus proche (en arrondissant les demis vers le
nombre pair). Si aucun argument n'est flottant, les processus de conversion et de
normalisation seront exacts (pas d'informations perdues).
timedelta.min
timedelta.max
L'objet timedelta le plus
positif, timedelta(days=999999999, hours=23, minutes=59, seconds=59,
microseconds=999999).
timedelta.resolution
Attribut Valeur
Entre
-999999
days 999 et
9999999
99 inclus
Attribut Valeur
Entre 0
seconds et 86399
inclus
Entre 0
microseco et
nds 999999
inclus
Opérations gérées :
Opératio
Résultat
n
Somme
de t2 et t3.
Ensuite t1
- t2 == t
t1 = t
3 et t1 - t
2 + t3
3 == t2 so
nt des
expressions
vraies. (1)
Différence
entre t2 et t3.
Ensuite t1
== t2 - t
t1 = t
3 et t2 ==
2 - t3
t1 + t3 so
nt des
expressions
vraies. (1)(6)
t1 = t Delta
2 * i multiplié par
or t1 un entier.
= i * Ensuite t1 // i
t2 == t2 est
vrai, en
admettant
Opératio
Résultat
n
que i != 0.
De manière
générale, t1 *
i == t1 * (i-1)
+ t1 est vrai.
(1)
Delta
multiplié par
un flottant.
Le résultat
est arrondi au
t1 = t multiple le
2 * f plus proche
or t1 de timedel
= f * ta.resolu
t2 tion en
utilisant la
règle de
l'arrondi au
pair le plus
proche.
Division (3)
de la durée
totale t2 par
f = t2 l'unité
/ t3 d'intervalle t
3. Renvoie
un
objet float.
Le quotient
est calculé et
t1 = t le reste (s'il y
2 // i en a un) est
or t1 = ignoré. Dans
t2 // le second
t3 cas, un entier
est renvoyé.
(3)
Le reste est
calculé
t1 = t comme un
2 % t3 objet de
type timede
lta. (3)
Calcule le
quotient et le
reste : q =
t1 // t2 (
q, r =
3)
divmod
et r = t1
(t1, t
% t2. q est
2)
un entier et r
est un
objet timed
elta.
+t1 Renvoie un
objet timed
elta avec la
Opératio
Résultat
n
même valeur.
(2)
équivalent
à timedelt
a(-t1.days, -
t1.seconds, -
-t1
t1.microseco
nds), et
à t1 * -1.
(1)(4)
équivalent
à +t quand t
.days >=
abs(t) 0, et à -
t quand t.d
ays < 0.
(2)
Renvoie une
chaîne de la
forme [D d
ay[s], ]
[H]H:MM:S
str(t)
S[.UUUUUU
], où D est
négatif
pour t négati
f. (5)
repr(t Renvoie une
) chaîne de la
forme
objet timed
elta comm
e un appel
construit
avec des
valeurs
d'attributs
Opératio
Résultat
n
canoniques.
Notes :
6. >>> timedelta(hours=-5)
7. datetime.timedelta(days=-1, seconds=68400)
8. >>> print(_)
9. -1 day, 19:00:00
10. L'expression t2 - t3 est toujours égale à l'expression t2 + (-t3) sauf
si t3 vaut timedelta.max` ; dans ce cas, la première expression produ
it une valeur alors que la seconde lève une ``OverflowError.
timedelta.total_seconds()
Notez que pour des intervalles de temps très larges (supérieurs à 270 ans sur la
plupart des plateformes), cette méthode perdra la précision des microsecondes.
Exemple d'utilisation :
Objets date
Un objet date représente une date (année, mois et jour) dans un calendrier idéal,
l'actuel calendrier grégorien étendu indéfiniment dans les deux directions. Le 1er
janvier de l'an 1 est appelé le jour numéro 1, le 2 janvier de l'an 1 est appelé le jour
numéro 2, et ainsi de suite. Cela correspond à la définition du calendrier « grégorien
proleptique » dans le livre Calendrical Calculations de Dershowitz et Reingold, où il
est la base de tous les calculs. Référez-vous au livre pour les algorithmes de
conversion entre calendriers grégorien proleptique et les autres systèmes.
class datetime.date(year, month, day)
All arguments are required. Arguments must be integers in the following ranges:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day <= nombre de jours dans le mois et l'année donnés
classmethod date.today()
classmethod date.fromtimestamp(timestamp)
classmethod date.fromordinal(ordinal)
classmethod date.fromisoformat(date_string)
Ceci n'implémente pas l'analyse de chaînes ISO 8601 arbitraires, ceci est seulement
destiné à réaliser l'opération inverse de date.isoformat().
Attributs de la classe :
date.min
date.max
date.resolution
date.year
Entre MINYEAR et MAXYEAR inclus.
date.month
Entre 1 et 12 inclus.
date.day
Opérations gérées :
Notes :
Les dates peuvent être utilisées en tant que clés de dictionnaires. Dans un contexte
booléen, tous les objets date sont considérés comme vrais.
Méthodes de l'instance :
date.replace(year=self.year, month=self.month, day=self.day)
Renvoie une date avec la même valeur, excepté pour les valeurs spécifiées par
arguments nommés. Par exemple, si d == date(2002, 12, 31),
alors d.replace(day=26) == date(2002, 12, 26).
date.timetuple()
Renvoie une time.struct_time telle que renvoyée par time.localtime(). Les
heures, minutes et secondes valent 0, et le flag DST (heure d'été) est -
1. d.timetuple() est équivalent
à time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(),
yday, -1)),
où yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1 est le
numéro du jour dans l'année courante, commençant avec 1 pour le 1er janvier.
date.toordinal()
date.weekday()
date.isoweekday()
date.isocalendar()
Par exemple, l'année 2004 débute un jeudi, donc la première semaine de l'année
ISO 2004 débute le lundi 29 décembre 2003 et se termine le dimanche 4 janvier
2004,
ainsi date(2003, 12, 29).isocalendar() == (2004, 1, 1) et date(2004,
1, 4).isocalendar() == (2004, 1, 7).
date.isoformat()
Renvoie une chaîne de caractères représentant la date au format ISO 8601, "YYYY-
MM-DD". Par exemple, date(2002, 12, 4).isoformat() == '2002-12-04'.
date.__str__()
date.ctime()
date.strftime(format)
Renvoie une chaîne de caractères représentant la date, contrôlée par une chaîne de
formatage explicite. Les codes de formatage se référant aux heures, minutes ou
secondes auront pour valeur 0. Pour une liste complète des directives de formatage,
voir Comportement de strftime() et strptime().
date.__format__(format)
>>>
Objets datetime
Un objet datetime est un objet comportant toutes les informations d'un
objet date et d'un objet time. Comme un objet date, un objet datetime utilise
l'actuel calendrier Grégorien étendu vers le passé et le futur ; comme un objet time,
un objet datetime suppose qu'il y a exactement 3600*24 secondes chaque jour.
Constructeur :
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microseco
nd=0, tzinfo=None, *, fold=0)
The year, month and day arguments are required. tzinfo may be None, or an instance
of a tzinfo subclass. The remaining arguments must be integers in the following
ranges:
MINYEAR <= year <= MAXYEAR,
1 <= month <= 12,
1 <= day <= nombre de jours dans le mois donné de l'année do
nnée,
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
classmethod datetime.today()
classmethod datetime.now(tz=None)
classmethod datetime.fromtimestamp(timestamp, tz=None)
classmethod datetime.utcfromtimestamp(timestamp)
datetime.fromtimestamp(timestamp, timezone.utc)
datetime(1970, 1, 1, tzinfo=timezone.utc) +
timedelta(seconds=timestamp)
classmethod datetime.fromordinal(ordinal)
classmethod datetime.combine(date, time, tzinfo=self.tzinfo)
classmethod datetime.fromisoformat(date_string)
Renvoie une datetime correspondant à date_string dans un des formats émis
par date.isoformat() et datetime.isoformat(). Plus spécifiquement, cette
fonction supporte des chaînes dans les format(s) YYYY-MM-
DD[*HH[:MM[:SS[.mmm[mmm]]]][+HH:MM[:SS[.ffffff]]]], où * peut égaler
n'importe quel caractère.
Prudence
This does not support parsing arbitrary ISO 8601 strings - it is only intended as the
inverse operation of datetime.isoformat(). A more full-featured ISO 8601
parser, dateutil.parser.isoparse is available in the third-party package dateutil.
classmethod datetime.strptime(date_string, format)
Attributs de la classe :
datetime.min
Le plus
ancien datetime représentable, datetime(MINYEAR, 1, 1, tzinfo=None).
datetime.max
Le
dernier datetime représentable, datetime(MAXYEAR, 12, 31, 23, 59, 59, 9
99999, tzinfo=None).
datetime.resolution
Entre MINYEAR et MAXYEAR inclus.
datetime.month
Entre 1 et 12 inclus.
datetime.day
datetime.hour
Dans range(24).
datetime.minute
Dans range(60).
datetime.second
Dans range(60).
datetime.microsecond
Dans range(1000000).
datetime.tzinfo
datetime.fold
0 ou 1. Utilisé pour désambiguïser les heures dans un intervalle répété. (Un intervalle
répété apparaît quand l'horloge est retardée à la fin de l'heure d'été ou quand le
décalage UTC du fuseau courant et décrémenté pour des raisons politiques.) La
valeur 0 (1) représente le plus ancien (récent) des deux moments représentés par la
même heure.
Opérations gérées :
1. datetime2 est décalé d'une durée timedelta par rapport à datetime1, en avant
dans le temps si timedelta.days > 0, ou en arrière si timedelta.days < 0. Le
résultat a le même attribut tzinfo que le datetime d'entrée, et datetime2 - datetime1
== timedelta après l'opération. Une OverflowError est levée
si datetime2.year devait être inférieure à MINYEAR ou supérieure à MAXYEAR. Notez
qu'aucun ajustement de fuseau horaire n'est réalisé même si l'entrée est avisée.
2. Calcule datetime2 tel que datetime2 + timedelta == datetime1.
Comme pour l'addition, le résultat a le même attribut tzinfo que
le datetime d'entrée, et aucun ajustement de fuseau horaire n'est réalisé même si
l'entrée est avisée.
3. La soustraction d'un datetime à un autre datetime n'est définie que si les
deux opérandes sont naïfs, ou s'ils sont les deux avisés. Si l'un est avisé et que
l'autre est naïf, une TypeError est levée.
Si les deux sont naïfs, ou que les deux sont avisés et ont le même attribut tzinfo,
les attributs tzinfo sont ignorés, et le résultat est un objet timedelta t tel
que datetime2 + t == datetime1. Aucun ajustement de fuseau horaire n'a lieu
dans ce cas.
Note
Méthodes de l'instance :
datetime.date()
datetime.time()
datetime.timetz()
datetime.astimezone(tz=None)
Si appelé sans arguments (ou si tz=None) le fuseau horaire local du système est
utilisé comme fuseau horaire cible. L'attribut .tzinfo de
l'instance datetime convertie aura pour valeur une instance de timezone avec le
nom de fuseau et le décalage obtenus depuis l'OS.
datetime.utcoffset()
Modifié dans la version 3.7: Le décalage UTC peut aussi être autre chose qu'un
ensemble de minutes.
datetime.dst()
Modifié dans la version 3.7: Le décalage DST n'est pas restreint à des minutes
entières.
datetime.tzname()
datetime.timetuple()
datetime.utctimetuple()
datetime.toordinal()
datetime.timestamp()
Note
datetime.weekday()
datetime.isoweekday()
datetime.isocalendar()
datetime.isoformat(sep='T', timespec='auto')
datetime.__str__()
datetime.ctime()
datetime.strftime(format)
Renvoie une chaîne représentant la date et l'heure, contrôlée par une chaîne de
format explicite. Pour une liste complète des directives de formatage,
voir Comportement de strftime() et strptime().
datetime.__format__(format)
Utilisation de datetime avec tzinfo :
Objets time
Un objet time représente une heure (locale) du jour, indépendante de tout jour
particulier, et sujette à des ajustements par un objet tzinfo.
class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold
=0)
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
Attributs de la classe :
time.min
time.max
time.resolution
time.hour
Dans range(24).
time.minute
Dans range(60).
time.second
Dans range(60).
time.microsecond
Dans range(1000000).
time.tzinfo
time.fold
0 ou 1. Utilisé pour désambiguïser les heures dans un intervalle répété. (Un intervalle
répété apparaît quand l'horloge est retardée à la fin de l'heure d'été ou quand le
décalage UTC du fuseau courant et décrémenté pour des raisons politiques.) La
valeur 0 (1) représente le plus ancien (récent) des deux moments représentés par la
même heure.
Opérations gérées :
Autre constructeur :
classmethod time.fromisoformat(time_string)
Prudence
Ceci ne gère pas l'analyse arbitraire de chaînes ISO 8601, ceci est seulement
destiné à l'opération inverse de time.isoformat().
Méthodes de l'instance :
time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=
self.microsecond, tzinfo=self.tzinfo, * fold=0)
time.isoformat(timespec='auto')
time.__str__()
time.strftime(format)
Renvoie une chaîne de caractères représentant la date, contrôlée par une chaîne de
formatage explicite. Pour une liste complète des directives de formatage,
voir Comportement de strftime() et strptime().
time.__format__(format)
time.utcoffset()
Modifié dans la version 3.7: Le décalage UTC peut aussi être autre chose qu'un
ensemble de minutes.
time.dst()
Si tzinfo est None, renvoie None, sinon renvoie self.tzinfo.dst(None), et lève
une exception si l'expression précédente ne renvoie pas None ou un
objet timedelta d'une magnitude inférieure à un jour.
Modifié dans la version 3.7: Le décalage DST n'est pas restreint à des minutes
entières.
time.tzname()
Exemple :
Objets tzinfo
class datetime.tzinfo
Cette classe est une classe abstraite, signifiant qu'elle ne doit pas être instanciée
directement. Vous devez en dériver une sous-classe concrète, et (au minimum)
fournir des implémentations aux méthodes standard tzinfo requises par les
méthodes de datetime que vous utilisez. Le module datetime fournit une simple
sous-classe concrète de tzinfo, timezone, qui peut peut représenter des fuseaux
horaires avec des décalages fixes par rapport à UTC, tels qu'UTC lui-même ou les
nord-américains EST et EDT.
tzinfo.utcoffset(dt)
Modifié dans la version 3.7: Le décalage UTC peut aussi être autre chose qu'un
ensemble de minutes.
tzinfo.dst(dt)
Renvoie l'ajustement d'heure d'été (DST, daylight saving time), comme un
objet timedelta ou None si l'information n'est pas connue.
Renvoie timedelta(0) si l'heure d'été n'est pas effective. Si elle est effective,
renvoie un décalage sous forme d'un objet timedelta (voir utcoffset() pour les
détails). Notez que ce décalage, si applicable, est déjà compris dans le décalage
UTC renvoyé par utcoffset(), il n'est donc pas nécessaire de faire appel
à dst() à moins que vous ne souhaitiez obtenir les informations séparément. Par
exemple, datetime.timetuple() appelle la méthode dst() de son
attribut tzinfo pour déterminer si l'option tm_isdst doit être activée,
et tzinfo.fromutc() fait appel à dst() pour tenir compte des heures d'été quand
elle traverse des fuseaux horaires.
tz.utcoffset(dt) - tz.dst(dt)
ou :
Modifié dans la version 3.7: Le décalage DST n'est pas restreint à des minutes
entières.
tzinfo.tzname(dt)
ZERO = timedelta(0)
HOUR = timedelta(hours=1)
SECOND = timedelta(seconds=1)
# A class capturing the platform's idea of local time.
# (May result in wrong values on historical times in
# timezones where UTC offset and/or the DST rules had
# changed in the past.)
import time as _time
class LocalTimezone(tzinfo):
Local = LocalTimezone()
def first_sunday_on_or_after(dt):
days_to_go = 6 - dt.weekday()
if days_to_go:
dt += timedelta(days_to_go)
return dt
# US DST Rules
#
# This is a simplified (i.e., wrong for a few cases) set of rules
for US
# DST start and end times. For a complete and up-to-date set of
DST rules
# and timezone definitions, visit the Olson Database (or try
pytz):
# http://www.twinsun.com/tz/tz-link.htm
# http://sourceforge.net/projects/pytz/ (might not be up-to-date)
#
# In the US, since 2007, DST starts at 2am (standard time) on the
second
# Sunday in March, which is the first Sunday on or after Mar 8.
DSTSTART_2007 = datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = datetime(1, 11, 1, 2)
# From 1987 to 2006, DST used to start at 2am (standard time) on
the first
# Sunday in April and to end at 2am (DST time) on the last
# Sunday of October, which is the first Sunday on or after Oct
25.
DSTSTART_1987_2006 = datetime(1, 4, 1, 2)
DSTEND_1987_2006 = datetime(1, 10, 25, 2)
# From 1967 to 1986, DST used to start at 2am (standard time) on
the last
# Sunday in April (the one on or after April 24) and to end at
2am (DST time)
# on the last Sunday of October, which is the first Sunday
# on or after Oct 25.
DSTSTART_1967_1986 = datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006
def us_dst_range(year):
# Find start and end times for US DST. For years before 1967,
return
# start = end for no DST.
if 2006 < year:
dststart, dstend = DSTSTART_2007, DSTEND_2007
elif 1986 < year < 2007:
dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
elif 1966 < year < 1987:
dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
else:
return (datetime(year, 1, 1), ) * 2
start = first_sunday_on_or_after(dststart.replace(year=year))
end = first_sunday_on_or_after(dstend.replace(year=year))
return start, end
class USTimeZone(tzinfo):
def __repr__(self):
return self.reprname
Notez que, deux fois par an, on rencontre des subtilités inévitables dans les sous-
classes de tzinfo représentant à la fois des heures standard et d'été, au passage
de l'une à l'autre. Concrètement, considérez le fuseau de l'est des États-Unis (UTC
-0500), où EDT (heure d'été) débute à la minute qui suit 1:59 (EST) le second
dimanche de mars, et se termine à la minute qui suit 1:59 (EDT) le premier dimanche
de novembre :
UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM
EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM
EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM
Quand l'heure d'été débute (la ligne « start »), l'horloge locale passe de 1:59 à 3:00.
Une heure de la forme 2:MM n'a pas vraiment de sens ce jour là,
donc astimezone(Eastern) ne délivrera pas de résultat avec hour == 2 pour le
jour où débute l'heure d'été. Par exemple, lors de la transition du printemps 2016,
nous obtenons
Les applications qui ne peuvent pas gérer ces ambiguïtés doivent vérifier
explicitement la valeur de l'attribut fold ou éviter d'utiliser des sous-
classes tzinfo hybrides ; il n'y a aucune ambiguïté lors de l'utilisation de la
classe timezone, ou toute autre sous-classe de tzinfo à décalage fixe (comme
une classe représentant uniquement le fuseau EST (de décalage fixe -5h) ou
uniquement EDT (-4h)).
Voir aussi
dateutil.tz
Objets timezone
La classe timezone est une sous-classe de tzinfo, où chaque instance représente
un fuseau horaire défini par un décalage fixe par rapport à UTC. Notez que les que
les objets de cette classe ne peuvent pas être utilisés pour représenter les
informations de fuseaux horaires dans des emplacements où plusieurs décalages
sont utilisés au cours de l'année ou où des changements historiques ont été opérés
sur le temps civil.
class datetime.timezone(offset, name=None)
L'argument offset doit être spécifié comme un objet timedelta représentant la
différence entre le temps local et UTC. Il doit être strictement compris entre -
timedelta(hours=24) et timedelta(hours=24), autrement
une ValueError est levée.
Modifié dans la version 3.7: Le décalage UTC peut aussi être autre chose qu'un
ensemble de minutes.
timezone.utcoffset(dt)
Modifié dans la version 3.7: Le décalage UTC peut aussi être autre chose qu'un
ensemble de minutes.
timezone.tzname(dt)
timezone.dst(dt)
Renvoie toujours None.
timezone.fromutc(dt)
Attributs de la classe :
timezone.utc
Comportement de strftime() et strptime()
Les objets date, datetime et time comportent tous une
méthode strftime(format), pour créer une représentation du temps sous forme
d'une chaîne de caractères, contrôlée par une chaîne de formatage explicite.
Grossièrement, d.strftime(fmt) se comporte comme la
fonction time.strftime(fmt, d.timetuple()) du module time, bien que tous
les objets ne comportent pas de méthode timetuple().
Pour les objets time, les codes de formatage pour l'année, le mois et le jour ne
devraient pas être utilisés, puisque les objets de temps ne possèdent pas de telles
valeurs. S'ils sont tout de même utilisés, 1900 est substitué à l'année, et 1 au mois et
au jour.
Pour les objets date, les codes de formatage pour les heures, minutes, secondes et
microsecondes ne devraient pas être utilisés, puisque les objets date ne possèdent
pas de telles valeurs. S'ils sont tous de même utilisés, ils sont substitués par 0.
Pour la même raison, la gestion des chaînes contenant des caractères (ou points)
Unicode qui ne peuvent pas être représentés dans la locale actuelle dépend aussi de
la plateforme. Sur certaines plateformes, ces caractères sont conservés tels quels
dans la sortie, alors que sur d'autres plateformes strftime lève
une UnicodeError ou renvoie une chaîne vide.
La liste suivante est la liste de tous les codes de formatage requis par le standard C
(version 1989), ils fonctionnent sur toutes les plateformes possédant une
implémentation de C standard. Notez que la version 1999 du standard C a ajouté
des codes de formatage additionnels.
Exemple Notes
Sunday, Monday, ..., Saturday (en_US);
0, 1, ..., 6
January, February, ..., December (en_US);
(4),
00, 01, ..., 59
(9)
Exemple Notes
08/16/88 (None);
08/16/1988 (en_US);
(1)
16/08/1988 (fr_FR)
21:30:00 (en_US) ;
Exemple Notes
1, 2, ..., 7
Notes :
%z
Le résultat de utcoffset() est transformé en une chaîne sous la
forme ±HHMM[SS[.uuuuuu]], où HH est une chaîne de deux chiffres donnant le
nombre d'heures du décalage UTC, où MM est une chaîne de deux chiffres donnant le
nombre de minutes du décalage UTC, où SS est une chaîne de deux chiffres donnant
le nombre de secondes du décalage UTC et où ffffff est une chaîne de six
chiffres donnant le nombre en micro-secondes du décalage UTC. Par exemple,
si utcoffset() renvoie timedelta(hours=-3, minutes=-30), %z est remplacé
par la chaîne '-0330'`.
Modifié dans la version 3.7: Le décalage UTC peut aussi être autre chose qu'un
ensemble de minutes.
%Z
Notes
2
Passer datetime.strptime(‘Feb 29’, ‘%b %d’) ne marchera pas
car 1900 n’est pas une année bissextile.
Les fonctions et les classes définies dans ce module utilisent un calendrier idéalisé,
le calendrier grégorien actuel s'étendant indéfiniment dans les deux sens. Cela
correspond à la définition du calendrier grégorien proleptique dans le livre de
Dershowitz et Reingold « Calendrical Calculations », œuvre dans lequel il est le
calendrier de référence de tous les calculs. Les années zéros et les années
négatives sont interprétées comme prescrit par la norme ISO 8601. L'année 0 est 1
avant JC, l'année -1 est 2 avant JC et ainsi de suite.
class calendar.Calendar(firstweekday=0)
iterweekdays()
Renvoie un itérateur sur les numéros des jours d'une semaine. La première valeur
est donc la même que la valeur de la propriété firstweekday.
itermonthdates(year, month)
Renvoie un itérateur sur les jours du mois month (1 à 12) de l'année year. Cet
itérateur renvoie tous les jours du mois (sous forme d'instances de datetime.date)
ainsi que tous les jours avant le début du mois et après la fin du mois nécessaires
pour obtenir des semaines complètes.
itermonthdays(year, month)
Renvoie un itérateur sur les jours du mois month de l'année year,
comme itermonthdates(), sans être limité par l'intervalle de datetime.date. Les
jours renvoyés sont simplement les numéros des jours du mois. Pour les jours en
dehors du mois spécifié, le numéro du jour est 0.
itermonthdays2(year, month)
Renvoie un itérateur sur les jours du mois month de
l'année year comme itermonthdates(), sans être limité par la
plage datetime.date. Les jours renvoyés sont des paires composées du numéro
du jour dans le mois et du numéro du jour dans la semaine.
itermonthdays3(year, month)
Renvoie un itérateur sur les jours du month de l'année year,
comme itermonthdates(), sans être limité par l'intervalle de datetime.date. Les
jours sont renvoyés sous forme de triplets composés du numéro de l'année, du mois
et du jour dans le mois.
itermonthdays4(year, month)
Renvoie un itérateur sur les jours du mois month de l'année year,
comme itermonthdates(), sans être limité par l'intervalle de datetime.date. Le
jours sont renvoyés sous forme de quadruplets contenant le numéro de l'année, du
mois, du jour du mois et du jour de la semaine.
monthdatescalendar(year, month)
Renvoie la liste des semaines complètes du mois month de l'année year. Les
semaines sont des listes de sept objets datetime.date.
monthdays2calendar(year, month)
Renvoie la liste des semaines complètes du mois month de l'année year. Les
semaines sont des listes de sept paires contenant le numéro du jour dans le mois et
du numéro du jour dans la semaine.
monthdayscalendar(year, month)
Renvoie la liste des semaines complètes du mois month de l'année year. Les
semaines sont une liste de sept numéros de jours.
yeardatescalendar(year, width=3)
Renvoie ce qu'il faut pour afficher correctement une année. La valeur renvoyée est
une liste de lignes de mois. Chaque ligne mensuelle contient jusqu'à width mois
(avec une valeur par défaut à 3). Chaque mois contient de 4 à 6 semaines et chaque
semaine 1 à 7 jours. Les jours sont des objets datetime.date.
yeardays2calendar(year, width=3)
Renvoie ce qu'il faut pour afficher correctement une année, (similaire
à yeardatescalendar()). Les listes des semaines contiennent des paires
contenant le numéro du jour du mois et le numéro du jour de la semaine. Les numéro
des jours en dehors de ce mois sont à zéro.
yeardayscalendar(year, width=3)
Renvoie ce qu'il faut pour afficher correctement une année, (similaire
à yeardatescalendar()). Les listes de semaines contiennent des numéros de
jours. Les numéros de jours en dehors de ce mois sont de zéro.
class calendar.TextCalendar(firstweekday=0)
Cette classe peut être utilisée pour générer des calendriers en texte brut.
formatmonth(theyear, themonth, w=0, l=0)
Donne le calendrier d'un mois dans une chaîne multi-ligne. Si w est fourni, il spécifie
la largeur des colonnes de date, qui sont centrées. Si l est donné, il spécifie le
nombre de lignes que chaque semaine utilisera. Le résultat varie en fonction du
premier jour de la semaine spécifié dans le constructeur ou défini par la
méthode setfirstweekday().
prmonth(theyear, themonth, w=0, l=0)
Affiche le calendrier d'un mois tel que renvoyé par formatmonth().
formatyear(theyear, w=2, l=1, c=6, m=3)
Renvoie un calendrier de m colonnes pour une année entière sous forme de chaîne
multi-ligne. Les paramètres facultatifs w, l et c correspondent respectivement à la
largeur de la colonne date, les lignes par semaines, le nombre d'espace entre les
colonnes de mois. Le résultat varie en fonction du premier jour de la semaine
spécifié dans le constructeur ou défini par la méthode setfirstweekday(). La
première année pour laquelle un calendrier peut être généré, dépend de la
plateforme.
pryear(theyear, w=2, l=1, c=6, m=3)
Affiche le calendrier pour une année entière comme renvoyé par formatyear().
class calendar.HTMLCalendar(firstweekday=0)
Cette classe peut être utilisée pour générer des calendriers HTML.
formatmonth(theyear, themonth, withyear=True)
Renvoie le calendrier d'un mois sous la forme d'une table HTML. Si withyear est vrai
l'année sera inclue dans l'en-tête, sinon seul le nom du mois sera utilisé.
formatyear(theyear, width=3)
Renvoie le calendrier d'une année sous la forme d'une table HTML. width (par défaut
à 3) spécifie le nombre de mois par ligne.
formatyearpage(theyear, width=3, css='calendar.css', encoding=None)
Renvoie le calendrier d'une année sous la forme d'une page HTML
complète. width (par défaut à 3) spécifie le nombre de mois par ligne. css est le nom
de la feuille de style en cascade à utiliser. None peut être passé si aucune feuille de
style ne doit être utilisée. encoding spécifie l'encodage à utiliser pour les données de
sortie (par défaut l'encodage par défaut du système).
cssclasses
Une liste de classes CSS utilisées pour chaque jour de la semaine. La liste par
défaut de la classe est :
cssclass_noday
La classe CSS pour le jour de la semaine apparaissant dans le mois précédent ou à
venir.
cssclasses_weekday_head
Une liste de classes CSS utilisées pour les noms des jours de la semaine dans la
ligne d'en-tête. Par défaut les mêmes que cssclasses.
cssclass_month_head
La classe CSS du mois en en-tête (utilisé par formatmonthname()). La valeur par
défaut est "month".
cssclass_month
La classe CSS pour la table du mois entière (utilisé par formatmonth()). La valeur
par défaut est "month".
cssclass_year
La classe CSS pour la table entière des tables de l'année (utilisé
par formatyear()). La valeur par défaut est "year".
Notez que même si le nommage ci-dessus des attributs de classe est au singulier (p.
ex. cssclass_month cssclass_noday), on peut remplacer la seule classe CSS
par une liste de classes CSS séparées par une espace, par exemple :
"text-bold text-red"
class CustomHTMLCal(calendar.HTMLCalendar):
cssclasses = [style + " text-nowrap" for style in
calendar.HTMLCalendar.cssclasses]
cssclass_month_head = "text-center month-head"
cssclass_month = "text-center month"
cssclass_year = "text-italic lead"
class calendar.LocaleTextCalendar(firstweekday=0, locale=None)
class calendar.LocaleHTMLCalendar(firstweekday=0, locale=None)
Note
calendar.setfirstweekday(weekday)
import calendar
calendar.setfirstweekday(calendar.SUNDAY)
calendar.firstweekday()
calendar.isleap(year)
calendar.leapdays(y1, y2)
calendar.weekday(year, month, day)
calendar.weekheader(n)
calendar.monthrange(year, month)
calendar.monthcalendar(year, month)
Returns a matrix representing a month's calendar. Each row represents a week; days
outside of the month a represented by zeros. Each week begins with Monday unless
set by setfirstweekday().
calendar.prmonth(theyear, themonth, w=0, l=0)
calendar.month(theyear, themonth, w=0, l=0)
calendar.prcal(year, w=0, l=0, c=6, m=3)
Affiche le calendrier pour une année entière tel que renvoyé par calendar().
calendar.calendar(year, w=2, l=1, c=6, m=3)
Renvoie un calendrier sur 3 colonnes pour une année entière dans une chaîne multi-
lignes en utilisant la méthode formatyear() de la classe TextCalendar.
calendar.timegm(tuple)
Une fonction sans rapport mais pratique, qui prend un n-uplet temporel tel que celui
renvoyé par la fonction gmtime() dans le module time, et renvoie la valeur
d'horodatage Unix (timestamp en anglais) correspondante, en supposant une
époque de 1970, et l'encodage POSIX. En fait, time.gmtime() et timegm() sont
l'inverse l'un de l'autre.
calendar.day_name
Un tableau qui représente les jours de la semaine pour les paramètres régionaux
actifs.
calendar.day_abbr
Un tableau qui représente les jours de la semaine en abrégé pour les paramètres
régionaux actifs.
calendar.month_name
Un tableau qui représente les mois de l'année pour les paramètres régionaux actifs.
Ceux-ci respectent la convention usuelle où janvier est le mois numéro 1, donc il a
une longueur de 13 et month_name[0] est la chaîne vide.
calendar.month_abbr
Un tableau qui représente les mois de l'année en abrégé pour les paramètres
régionaux actifs. Celui-ci respectent la convention usuelle où janvier est le mois
numéro 1, donc il a une longueur de 13 et month_name[0] est la chaîne vide.
Voir aussi
Module datetime
Interface orientée objet pour les dates et les heures avec des fonctionnalités
similaires au module time.
Module time
Objets ChainMap
Nouveau dans la version 3.3.
Cette classe peut être utilisée pour simuler des portées imbriquées, elle est aussi
utile pour le templating.
class collections.ChainMap(*maps)
Les dictionnaires sous-jacents sont stockés dans une liste. Celle-ci est publique et
peut être consultée ou mise à jour via l'attribut maps. Il n'y a pas d'autre état.
maps
Liste de dictionnaires éditable par l'utilisateur et classée selon l'ordre de recherche. Il
s'agit de l'unique état stocké et elle peut être modifiée pour changer l'ordre de
recherche. La liste doit toujours contenir au moins un dictionnaire.
new_child(m=None)
Renvoie un nouvel objet ChainMap contenant un nouveau dictionnaire suivi par tous
les autres de l'instance actuelle. Si m est spécifié, il devient le nouveau dictionnaire
au début de la liste ; sinon, un dictionnaire vide est utilisé, de telle manière
qu'appeler d.new_child() équivaut à appeler ChainMap({}, *d.maps). Cette
méthode est utile pour créer des sous-contextes qui peuvent être mis à jour sans
altérer les valeurs dans les dictionnaires parents.
parents
Propriété qui renvoie un nouvel objet ChainMap contenant tous les dictionnaires de
l'instance actuelle hormis le premier. Cette propriété est utile pour ignorer le premier
dictionnaire dans les recherches ; son utilisation rappelle le mot-clé nonlocal (utilisé
pour les portées imbriquées), ou bien la fonction native super(). Une référence
à d.parents est équivalente à : ChainMap(*d.maps[1:]).
>>>
>>>
Cette partie montre diverses approches afin de travailler avec les dictionnaires
chaînés.
import builtins
pylookup = ChainMap(locals(), globals(), vars(builtins))
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = {k: v for k, v in vars(namespace).items() if
v is not None}
class DeepChainMap(ChainMap):
'Variant of ChainMap that allows direct updates to inner
scopes'
Objets Counter
Ce module fournit un outil pour effectuer rapidement et facilement des
dénombrements. Par exemple :
>>>
Les éléments sont comptés à partir d'un itérable ou initialisés à partir d'un autre
dictionnaire (ou compteur) :
Les objets Counter ont une interface de dictionnaire, à l'exception près qu'ils
renvoient zéro au lieu de lever une exception KeyError pour des éléments
manquants :
Mettre un comptage à zéro pour un élément ne le retire pas de l'objet Counter. Il faut
utiliser del pour le supprimer complètement :
En plus des méthodes disponibles pour tous les dictionnaires, les objets compteurs
gèrent trois méthodes supplémentaires :
elements()
Renvoie un itérateur sur chaque élément en le répétant autant de fois que la valeur
du compteur associé. Les éléments sont renvoyés dans un ordre arbitraire. Si le
comptage d'un élément est strictement inférieur à 1, alors elements() l'ignore.
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
subtract([iterable-or-mapping])
Les éléments sont soustraits à partir d'un itérable ou d'un autre dictionnaire (ou
compteur). Cette méthode se comporte comme dict.update() mais soustrait les
nombres d'occurrences au lieu de les remplacer. Les entrées et sorties peuvent être
négatives ou nulles.
Les méthodes usuelles des dictionnaires sont disponibles pour les objets Counter à
l'exception de deux méthodes qui fonctionnent différemment pour les compteurs.
fromkeys(iterable)
Cette méthode de classe n'est pas implémentée pour les objets Counter.
update([iterable-or-mapping])
Les éléments sont comptés à partir d'un itérable ou ajoutés d'un autre dictionnaire
(ou compteur). Cette méthode se comporte comme dict.update() mais additionne
les nombres d'occurrences au lieu de les remplacer. De plus, l'itérable doit être une
séquence d'éléments et non une séquence de paires (clé, valeur).
L'addition et la soustraction unaires (avec un seul terme) sont des raccourcis pour
respectivement additionner un compteur avec un compteur vide ou et pour
retrancher un compteur d'un compteur vide.
Note
Les compteurs ont été conçus essentiellement pour fonctionner avec des entiers
naturels pour représenter les dénombrements en cours ; cependant, les cas
d'utilisation nécessitant d'autres types ou des valeurs négatives n'ont pas été
écartés. Pour vous aider dans ces cas particuliers, cette section documente la plage
minimale et les restrictions de type.
La classe Counter est elle-même une sous-classe de dictionnaire sans
restriction particulière sur ces clés ou valeurs. Les valeurs ont vocation à être des
nombres représentants des comptages, mais il est possible de stocker n'importe quel
type de valeur.
La méthode most_common() exige uniquement que les valeurs soient
ordonnables.
Les opérations de remplacement telles que c[key] += 1 exigent une valeur
dont le type gère l'addition et la soustraction. Cela inclut donc les fractions, les
flottants et les décimaux, y compris négatifs. Il en va de même
pour update() et substract() qui acceptent des valeurs négatives ou nulles dans
les entrées et sorties.
Les méthodes de multiensembles sont uniquement conçues pour les cas
d'utilisation avec des valeurs positives. Les entrées peuvent contenir des valeurs
négatives ou nulles, mais seules les sorties avec des valeurs positives sont créées. Il
n'y a pas de restriction de type, mais les types des valeurs doivent gérer l'addition, la
soustraction et la comparaison.
La méthode elements() exige des valeurs entières et ignore les valeurs
négatives ou nulles.
Voir aussi
Bag class dans Smalltalk.
L'article Wikipédia sur les multiensembles sur Wikipédia (ou l'article en
anglais).
Des guides et exemples à propos des multiensembles en C++.
Pour les opérations mathématiques sur les multiensembles et leurs
applications, voir Knuth, Donald. The Art of Computer Programming Volume II,
Section 4.6.3, Exercise 19.
Pour lister tous les multiensembles distincts de même taille parmi un
ensemble donné d'éléments,
voir itertools.combinations_with_replacement() :
map(Counter, combinations_with_replacement('ABC', 2)) # -->
AA AB AC BB BC CC
Objets deque
class collections.deque([iterable[, maxlen]])
Bien que les les objets list gèrent des opérations similaires, ils sont optimisés pour
des opérations qui ne changent pas la taille de la liste. Les
opérations pop(0) et insert(0, v) qui changent la taille et la position de la
représentation des données sous-jacentes entraînent des coûts de déplacement de
mémoire en O(n).
append(x)
Ajoute x à l'extrémité droite de la deque.
appendleft(x)
Ajoute x à l'extrémité gauche de la deque.
clear()
Supprime tous les éléments de la deque et la laisse avec une longueur de 0.
copy()
Crée une copie superficielle de la deque.
count(x)
Compte le nombre d'éléments de la deque égaux à x.
extend(iterable)
Étend la deque en ajoutant les éléments de l'itérable en argument à son extrémité
droite.
extendleft(iterable)
Étend la deque en ajoutant les éléments d'iterable à son extrémité gauche. Dans ce
cas, notez que la série d'ajouts inverse l'ordre des éléments de l'argument itérable.
index(x[, start[, stop]])
Renvoie la position de x dans la deque (à partir de start inclus et jusqu'à stop exclus).
Renvoie la première correspondance ou lève ValueError si aucune n'est trouvée.
insert(i, x)
Insère x dans la deque à la position i.
pop()
Retire et renvoie un élément de l'extrémité droite de la deque. S'il n'y a aucun
élément, lève une exception IndexError.
popleft()
Retire et renvoie un élément de l'extrémité gauche de la deque. S'il n'y a aucun
élément, lève une exception IndexError.
remove(value)
Supprime la première occurrence de value. Si aucune occurrence n'est trouvée, lève
une exception ValueError.
reverse()
Inverse le sens des éléments de la deque sans créer de copie et renvoie None.
rotate(n=1)
Décale les éléments de la deque de n places vers la droite (le dernier élément
revient au début). Si n est négatif, décale vers la gauche.
Quand la deque n'est pas vide, un décalage d'une place vers la droite équivaut
à d.appendleft(d.pop()) et un décalage d'une place vers la gauche est
équivalent à d.append(d.popleft()).
maxlen
La taille maximale d'une deque, ou None si illimitée.
Exemple :
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
iterators = deque(map(iter, iterables))
while iterators:
try:
while True:
yield next(iterators[0])
iterators.rotate(-1)
except StopIteration:
# Remove an exhausted iterator.
iterators.popleft()
Objets defaultdict
class collections.defaultdict([default_factory[, ...]])
__missing__(key)
Si l'attribut default_factory est None, lève une
exception KeyError avec key comme argument.
Si default_fatory` ne vaut pas None, cet attribut est appelé sans argument pour
fournir une valeur par défaut pour la key demandée. Cette valeur est insérée dans le
dictionnaire avec pour clé key et est renvoyée.
default_factory
Cet attribut est utilisé par la méthode __missing__() ; il est initialisé par le premier
argument passé au constructeur, s'il est spécifié, sinon par None.
Exemples utilisant defaultdict
Utiliser list comme default_factory facilite le regroupement d'une séquence de
paires clé-valeur en un dictionnaire de listes :
Lorsque chaque clé est rencontrée pour la première fois, elle n'est pas encore
présente dans le dictionnaire, donc une entrée est automatiquement créée grâce à la
fonction default_factory qui renvoie un objet list vide.
L'opération list.append() ajoute la valeur à la nouvelle liste. Quand les clés sont
à nouveau rencontrées, la recherche se déroule correctement (elle renvoie la liste de
cette clé) et l'opération list.append() ajoute une autre valeur à la liste. Cette
technique est plus simple et plus rapide qu'une technique équivalente
utilisant dict.setdefault() :
>>> d = {}
>>> for k, v in s:
... d.setdefault(k, []).append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
Quand une lettre est rencontrée pour la première fois, elle n'est pas dans le
dictionnaire, donc la fonction default_factory appelle int() pour mettre un
nouveau compteur à zéro. L'incrémentation augmente ensuite le comptage pour
chaque lettre.
N'importe quel identifiant Python peut être utilisé pour un nom de champ hormis ceux
commençant par un tiret bas. Les identifiants valides peuvent contenir des lettres,
des chiffres (sauf en première position) et des tirets bas (sauf en première position).
Un identifiant ne peut pas être un keyword tel
que class, for, return, global, pass ou raise.
Les instances de tuples nommés n'ont pas de dictionnaires propres, elles sont donc
légères et ne requièrent pas plus de mémoire que les tuples natifs.
Les tuples nommés sont particulièrement utiles pour associer des noms de champs à
des tuples renvoyés par les modules csv ou sqlite3 :
import csv
for emp in map(EmployeeRecord._make,
csv.reader(open("employees.csv", "rb"))):
print(emp.name, emp.title)
import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade
FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
print(emp.name, emp.title)
En plus des méthodes héritées de tuple, les tuples nommés implémentent trois
méthodes et deux attributs supplémentaires. Pour éviter les conflits avec noms de
champs, leurs noms commencent par un tiret bas.
classmethod somenamedtuple._make(iterable)
Méthode de classe qui construit une nouvelle instance à partir d'une séquence ou
d'un itérable existant.
somenamedtuple._replace(**kwargs)
Renvoie une nouvelle instance du tuple nommé en remplaçant les champs spécifiés
par leurs nouvelles valeurs :
>>>
Dictionnaire qui assigne les valeurs par défaut aux noms des champs.
>>> Account = namedtuple('Account', ['type', 'balance'],
defaults=[0])
>>> Account._field_defaults
{'balance': 0}
>>> Account('premium')
Account(type='premium', balance=0)
Pour récupérer un champ dont le nom est une chaîne de caractères, utilisez la
fonction getattr() :
Il est aisé d'ajouter ou de modifier les fonctionnalités des tuples nommés grâce à
l'héritage puisqu'il s'agit de simples classes. Voici comment ajouter un champ calculé
avec une longueur fixe d'affichage :
L'héritage n'est pas pertinent pour ajouter de nouveaux champs. Il est préférable de
simplement créer un nouveau type de tuple nommé avec l'attribut _fields :
>>> Point3D = namedtuple('Point3D', Point._fields + ('z',))
Objets OrderedDict
Les dictionnaires ordonnés sont des dictionnaires comme les autres mais possèdent
des capacités supplémentaires pour s'ordonner. Ils sont maintenant moins
importants puisque la classe native dict sait se souvenir de l'ordre d'insertion (cette
fonctionnalité a été garantie par Python 3.7).
Quelques différences persistent vis-à-vis de dict :
Les dict classiques ont été conçus pour être performants dans les opérations
de correspondance. Garder une trace de l'ordre d'insertion était secondaire.
Les OrderedDict ont été conçus pour être performants dans les opérations
de ré-arrangement. L'occupation mémoire, la vitesse de parcours et les
performances de mise à jour étaient secondaires.
Algorithmiquement, OrderedDict gère mieux les ré-arrangements fréquents
que dict. Ceci la rend adaptée pour suivre les accès les plus récents (par exemple
pour implémenter un cache LRU pour Least Recently Used en anglais).
Le test d'égalité de OrderedDict vérifie si l'ordre correspond.
La méthode popitem() de OrderedDict possède une signature différente.
Elle accepte un argument optionnel pour spécifier quel élément doit être enlevé.
OrderedDict possède une méthode move_to_end() pour déplacer
efficacement un élément à la fin.
Avant Python 3.8, dict n'a pas de méthode __reversed__().
class collections.OrderedDict([items])
popitem(last=True)
La méthode popitem() pour les dictionnaires ordonnés retire et renvoie une
paire (clé, valeur). Les paires sont renvoyées comme pour une pile, c'est-à-dire
dernier entré, premier sorti (en anglais LIFO) si last vaut True. Si last vaut False,
alors les paires sont renvoyées comme pour une file, c'est-à-dire premier entré,
premier sorti (en anglais FIFO).
move_to_end(key, last=True)
Déplace une clé key existante à l'une des deux extrémités du dictionnaire : à droite
si last vaut True (comportement par défaut) ou à gauche sinon. Lève une
exception KeyError si la clé key n'est pas trouvée :
>>>
>>> d = OrderedDict.fromkeys('abcde')
>>> d.move_to_end('b')
>>> ''.join(d.keys())
'acdeb'
>>> d.move_to_end('b', last=False)
>>> ''.join(d.keys())
'bacde'
En plus des méthodes usuelles des dictionnaires, les dictionnaires ordonnés gèrent
l'itération en sens inverse grâce à reversed().
Il est facile de créer une variante de dictionnaire ordonné qui retient l'ordre dans
lequel les clés ont été insérées en dernier. Si une nouvelle entrée écrase une
existante, la position d'insertion d'origine est modifiée et déplacée à la fin :
class LastUpdatedOrderedDict(OrderedDict):
'Store items in the order the keys were last added'
class LRU(OrderedDict):
'Limit size, evicting the least recently looked-up key when
full'
Objets UserDict
La classe UserDict se comporte comme une surcouche autour des dictionnaires.
L'utilité de cette classe est réduite car on peut maintenant hériter directement
de dict. Cependant, il peut être plus facile de travailler avec celle-ci car le
dictionnaire sous-jacent est accessible comme attribut.
class collections.UserDict([initialdata])
data
Un dictionnaire natif où est stocké le contenu de la classe UserDict.
Objets UserList
Cette classe agit comme une surcouche autour des objets list. C'est une classe
mère utile pour vos classes listes-compatibles qui peuvent en hériter et surcharger
les méthodes existantes ou en ajouter de nouvelles. Ainsi, on peut ajouter de
nouveaux comportements aux listes.
L'utilité de cette classe a été partiellement réduite par la possibilité d'hériter
directement de list. Cependant, il peut être plus facile de travailler avec cette
classe car la liste sous-jacente est accessible via un attribut.
class collections.UserList([list])
En plus de gérer les méthodes et opérations des séquences muables, les instances
de UserList possèdent l'attribut suivant :
data
Un objet list natif utilisé pour stocker le contenu de la classe UserList.
Si une classe fille ne remplit pas cette condition, toutes les méthodes spéciales
gérées par cette classe devront être implémentées à nouveau. Merci de consulter les
sources pour obtenir des informations sur les méthodes qui doivent être fournies
dans ce cas.
Objets UserString
La classe UserString agit comme une surcouche autour des objets str. L'utilité de
cette classe a été partiellement réduite par la possibilité d'hériter directement de str.
Cependant, il peut être plus facile de travailler avec cette classe car la chaîne de
caractère sous-jacente est accessible via un attribut.
class collections.UserString(seq)
data
Un objet str natif utilisé pour stocker le contenu de la classe UserString.
Hasha
__hash__
ble
Itera
__iter__
ble
Itera
Iterable __next__ __iter__
tor
ABC Hérite de Méthodes abstraites Méthodes mixin
Rever
Iterable __reversed__
sible
Gener
Iterator send, throw close, __iter__, __next__
ator
Sized __len__
Calla
__call__
ble
Sized, It
Colle __contains__, __it
erable, C
ction er__, __len__
ontainer
Reversib
Seque __getitem__, __len __contains__, __iter__, __reve
le, Colle
nce __ rsed__, index et count
ction
ByteS __getitem__, __len
Sequence Méthodes héritées de Sequence
tring __
__le__, __lt__, __eq__, __ne__,
Collecti __contains__, __it
Set __gt__, __ge__, __and__, __or__,
on er__, __len__
__sub__, __xor__ et isdisjoint
__getitem__, __set
Mutab Méthodes héritées de Mapping,
item__, __delitem_
leMap Mapping et pop, popitem, clear, update et
_, __iter__, __len_
ping setdefault
_
Mappi
ngVie Sized __len__
w
ABC Hérite de Méthodes abstraites Méthodes mixin
Items MappingV
__contains__, __iter__
View iew, Set
KeysV MappingV
__contains__, __iter__
iew iew, Set
MappingV
Value
iew, Coll __contains__, __iter__
sView
ection
Await
__await__
able
Corou Awaitabl
send, throw close
tine e
Async
Itera __aiter__
ble
Async
AsyncIte
Itera __anext__ __aiter__
rable
tor
Async
AsyncIte
Gener asend, athrow aclose, __aiter__, __anext__
rator
ator
class collections.abc.Container
class collections.abc.Hashable
class collections.abc.Sized
class collections.abc.Callable
class collections.abc.Iterable
class collections.abc.Iterator
class collections.abc.Reversible
class collections.abc.Generator
ABC pour les classes de générateurs qui implémentent le protocole défini dans
la PEP 342 qui étend les itérateurs avec les
méthodes send(), throw() et close(). Voir aussi la définition de générateur.
class collections.abc.Sequence
class collections.abc.MutableSequence
class collections.abc.ByteString
class collections.abc.Set
class collections.abc.MutableSet
ABC pour les ensembles immuables et muables.
class collections.abc.Mapping
class collections.abc.MutableMapping
class collections.abc.MappingView
class collections.abc.ItemsView
class collections.abc.KeysView
class collections.abc.ValuesView
class collections.abc.Awaitable
ABC pour les objets awaitables, qui peuvent être utilisés dans les
expressions await. Les implémentations personnalisées doivent définir la
méthode __await__().
Note
En CPython, les coroutines basées sur les générateurs (les générateurs décorés
avec types.coroutine() ou asyncio.coroutine()) sont awaitables, bien
qu'elles n'aient pas de méthode __await__().
Évaluer isinstance(gencoro, Awaitable) où gencoro est un générateur
décoré va renvoyer False. Utilisez inspect.isawaitable() pour les détecter.
class collections.abc.Coroutine
ABC pour les classes compatibles avec les coroutines. Elles implémentent les
méthodes suivantes, définies dans Objets
coroutines : send(), throw() et close(). Les implémentations personnalisées
doivent également fournir __await__(). Toutes les instances de Coroutine sont
également des instances de Awaitable. Voir aussi la définition de coroutine.
Note
En CPython, les coroutines basées sur les générateurs (les générateurs décorés
avec types.coroutine() ou asyncio.coroutine()) sont awaitables, bien
qu'elles n'aient pas de méthode __await__().
Évaluer isinstance(gencoro, Corourine) où gencoro est un générateur
décoré va renvoyer False. Utilisez inspect.isawaitable() pour les détecter.
class collections.abc.AsyncIterable
ABC pour les classes qui définissent la méthode __aiter__. Voir aussi la définition
d'itérable asynchrone.
class collections.abc.AsyncIterator
class collections.abc.AsyncGenerator
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
Une partie des ABC sont également utiles en tant que mixins : cela rend plus facile le
développement de classes qui gèrent des API de conteneurs. Par exemple, pour
écrire une classe qui gère l'API entière de Set, il est uniquement nécessaire de
fournir les trois méthodes sous-jacentes
abstraites __contains__(), __iter__() et __len__(). L'ABC apporte les
méthodes restantes, comme __and__() et isdisjoint() :
class ListBasedSet(collections.abc.Set):
''' Alternate set implementation favoring space over speed
and not requiring the set elements to be hashable. '''
def __init__(self, iterable):
self.elements = lst = []
for value in iterable:
if value not in lst:
lst.append(value)
def __iter__(self):
return iter(self.elements)
def __len__(self):
return len(self.elements)
s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
overlap = s1 & s2 # The __and__() method is supported
automatically
1. Comme une partie des opérations sur les ensembles créent de nouveaux
ensembles, les méthodes mixins par défaut ont besoin d'un moyen de créer de
nouvelles instances à partir d'un itérable. Le constructeur de classe est supposé
avoir une signature de la forme ClassName(iterable). Cette supposition est faite
par une méthode de classe interne appelée _from_iterable() qui
appelle cls(iterable) pour construire un nouvel ensemble. Si le Set mixin est
utilisé dans une classe avec un constructeur de signature différente, vous devrez
surcharger _from_iterable() avec une méthode de classe qui peut construire de
nouvelles instances à partir d'un argument itérable.
2. Pour surcharger les comparaisons (a priori pour la rapidité, puisque la
sémantique est fixe), il faut redéfinir __le__() et __ge__(), puis les autres
opérations seront automatiquement adaptées.
3. La classe mixin Set apporte une méthode _hash() pour calculer une valeur
de hachage pour l'ensemble ; cependant __hash__() n'est pas défini car tous les
ensembles ne sont pas hachables ou immuables. Pour rendre un ensemble
hachable en utilisant les mixins, héritez de Set() et de Hashable(), puis
définissez __hash__ = Set._hash.
Voir aussi
OrderedSet recipe pour un exemple construit sur MutableSet.
Pour plus d'informations à propos des ABC, voir le module abc et la PEP
3119.
Les tas sont des arbres binaires pour lesquels chaque valeur portée par un nœud est
inférieure ou égale à celle de ses deux fils. Cette implémentation utilise des tableaux
pour lesquels tas[k] <= tas[2*k+1] et tas[k] <= tas[2*k+2] pour tout k, en
commençant la numérotation à zéro. Pour contenter l'opérateur de comparaison, les
éléments inexistants sont considérés comme porteur d'une valeur infinie. L'intérêt du
tas est que son plus petit élément est toujours la racine, tas[0].
L'API ci-dessous diffère de la file de priorité classique par deux aspects : (a)
l'indiçage commence à zéro. Cela complexifie légèrement la relation entre l'indice
d'un nœud et les indices de ses fils mais est alignée avec l'indiçage commençant à
zéro que Python utilise. (b) La méthode pop renvoie le plus petit élément et non le
plus grand (appelé « tas-min » dans les manuels scolaires ; le « tas-max » étant
généralement plus courant dans la littérature car il permet le classement sans
tampon).
Ces deux points permettent d'aborder le tas comme une liste Python standard sans
surprise : heap[0] est le plus petit élément et heap.sort() conserve l'invariant du
tas !
Pour créer un tas, utilisez une liste initialisée à [] ou bien utilisez une liste existante
et transformez la en tas à l'aide de la fonction heapify().
heapq.heappush(heap, item)
Introduit la valeur item dans le tas heap, en conservant l'invariance du tas.
heapq.heappop(heap)
Extraie le plus petit élément de heap en préservant l'invariant du tas. Si le tas est
vide, une exception IndexError est levée. Pour accéder au plus petit élément sans
le retirer, utilisez heap[0].
heapq.heappushpop(heap, item)
Introduit l'élément item dans le tas, puis extraie le plus petit élément de heap. Cette
action combinée est plus efficace que heappush() suivie par un appel séparé
à heappop().
heapq.heapify(x)
heapq.heapreplace(heap, item)
Cette opération en une étape est plus efficace qu'un appel à heappop() suivi d'un
appel à heappush() et est plus appropriée lorsque le tas est de taille fixe. La
combinaison pop/push renvoie toujours un élément du tas et le remplace par item.
La valeur renvoyée peut être plus grande que l'élément item ajouté. Si cela n'est pas
souhaitable, utilisez plutôt heappushpop() à la place. Sa
combinaison push/pop renvoie le plus petit élément des deux valeurs et laisse la plus
grande sur le tas.
heapq.merge(*iterables, key=None, reverse=False)
Fusionne plusieurs entrées ordonnées en une unique sortie ordonnée (par exemple,
fusionne des entrées datées provenant de multiples journaux applicatifs). Renvoie
un iterator sur les valeurs ordonnées.
A deux arguments optionnels qui doivent être fournis par mot clef.
key spécifie une key function d'un argument utilisée pour extraire une clef de
comparaison de chaque élément de la liste. La valeur par défaut est None (compare
les éléments directement).
reverse est une valeur booléenne. Si elle est True, la liste d'éléments est fusionnée
comme si toutes les comparaisons étaient inversées. Pour obtenir un comportement
similaire à sorted(itertools.chain(*iterables), reverse=True), tous les
itérables doivent être classés par ordre décroissant.
heapq.nlargest(n, iterable, key=None)
Renvoie une liste contenant les n plus grands éléments du jeu de données défini
par iterable. Si l'option key est fournie, celle-ci spécifie une fonction à un argument
qui est utilisée pour extraire la clé de comparaison de chaque élément
dans iterable (par exemple, key=str.lower). Équivalent
à : sorted(iterable, key=key, reverse=True)[:n].
heapq.nsmallest(n, iterable, key=None)
Renvoie une liste contenant les n plus petits éléments du jeu de données défini
par iterable. Si l'option key est fournie, celle-ci spécifie une fonction à un argument
qui est utilisée pour extraire la clé de comparaison de chaque élément
dans iterable (par exemple, key=str.lower). Équivalent
à : sorted(iterable, key=key)[:n].
Les deux fonctions précédentes sont les plus efficaces pour des petites valeurs de n.
Pour de grandes valeurs, il est préférable d'utiliser la fonction sorted(). En outre,
lorsque n==1, il est plus efficace d'utiliser les fonctions natives min() et max(). Si
vous devez utiliser ces fonctions de façon répétée, il est préférable de transformer
l'itérable en tas.
Exemples simples
Un tri par tas peut être implémenté en introduisant toutes les valeurs dans un tas
puis en effectuant l'extraction des éléments un par un :
>>>
Les éléments d'un tas peuvent être des n-uplets. C'est pratique pour assigner des
valeurs de comparaison (par exemple, des priorités de tâches) en plus de l'élément
qui est suivi :
>>>
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')
Une solution aux deux premiers problèmes consiste à stocker les entrées sous forme
de liste à 3 éléments incluant la priorité, le numéro d'ajout et la tâche. Le numéro
d'ajout sert à briser les égalités de telle sorte que deux tâches avec la même priorité
sont renvoyées dans l'ordre de leur insertion. Puisque deux tâches ne peuvent
jamais avoir le même numéro d'ajout, la comparaison des triplets ne va jamais
chercher à comparer des tâches entre elles.
Une autre solution au fait que les tâches ne possèdent pas de relation d'ordre est de
créer une classe d'encapsulation qui ignore l'élément tâche et ne compare que le
champ priorité :
@dataclass(order=True)
class PrioritizedItem:
priority: int
item: Any=field(compare=False)
Supprimer une entrée ou changer sa priorité est plus difficile puisque cela romprait
l'invariant de la structure de tas. Une solution possible est de marquer l'entrée
comme supprimée et d'ajouter une nouvelle entrée avec sa priorité modifiée :
def remove_task(task):
'Mark an existing task as REMOVED. Raise KeyError if not
found.'
entry = entry_finder.pop(task)
entry[-1] = REMOVED
def pop_task():
'Remove and return the lowest priority task. Raise KeyError
if empty.'
while pq:
priority, count, task = heappop(pq)
if task is not REMOVED:
del entry_finder[task]
return task
raise KeyError('pop from an empty priority queue')
Théorie
Les tas sont des tableaux pour
lesquels a[k] <= a[2*k+1] et a[k] <= a[2*k+2] pour tout k en comptant les
éléments à partir de 0. Pour simplifier la comparaison, les éléments inexistants sont
considérés comme étant infinis. L'intérêt des tas est que a[0] est toujours leur plus
petit élément.
1 2
3 4 5 6
7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Si cet invariant de tas est vérifié à tout instant, alors l'élément à l'indice 0 est le
vainqueur global. L'algorithme le plus simple pour le retirer et trouver le vainqueur
« suivant » consiste à déplacer un perdant (par exemple le nœud 30 dans le
diagramme ci-dessus) à la position 0, puis à faire redescendre cette nouvelle racine
dans l'arbre en échangeant sa valeur avec celle d'un de ses fils jusqu'à ce que
l'invariant soit rétabli. Cette approche a un coût logarithmique par rapport au nombre
total d'éléments dans l'arbre. En itérant sur tous les éléments, le classement
s'effectue en O(n log n) opérations.
Une propriété agréable de cet algorithme est qu'il est possible d'insérer efficacement
de nouveaux éléments en cours de classement, du moment que les éléments
insérés ne sont pas « meilleurs » que le dernier élément qui a été extrait. Ceci
s'avère très utile dans des simulations où l'arbre contient la liste des événements
arrivants et que la condition de « victoire » est le plus petit temps d'exécution planifié.
Lorsqu'un événement programme l'exécution d'autres événements, ceux-ci sont
planifiés pour le futur et peuvent donc rejoindre le tas. Ainsi, le tas est une bonne
structure pour implémenter un ordonnanceur (et c'est ce que j'ai utilisé pour mon
séquenceur MIDI ☺).
Plusieurs structures ont été étudiées en détail pour implémenter des ordonnanceurs
et les tas sont bien adaptés : ils sont raisonnablement rapides, leur vitesse est
presque constante et le pire cas ne diffère pas trop du cas moyen. S'il existe des
représentations qui sont plus efficaces en général, les pires cas peuvent être
terriblement mauvais.
Les tas sont également très utiles pour ordonner les données sur de gros disques.
Vous savez probablement qu'un gros tri implique la production de séquences pré-
classées (dont la taille est généralement liée à la quantité de mémoire CPU
disponible), suivie par une passe de fusion qui est généralement organisée de façon
très intelligente 1. Il est très important que le classement initial produise des
séquences les plus longues possibles. Les tournois sont une bonne façon d'arriver à
ce résultat. Si, en utilisant toute la mémoire disponible pour stocker un tournoi, vous
remplacez et faites percoler les éléments qui s'avèrent acceptables pour la séquence
courante, vous produirez des séquences d'une taille égale au double de la mémoire
pour une entrée aléatoire et bien mieux pour une entrée approximativement triée.
Qui plus est, si vous écrivez l'élément 0 sur le disque et que vous recevez en entrée
un élément qui n'est pas adapté au tournoi actuel (parce que sa valeur « gagne » par
rapport à la dernière valeur de sortie), alors il ne peut pas être stocké dans le tas
donc la taille de ce dernier diminue. La mémoire libérée peut être réutilisée
immédiatement pour progressivement construire un deuxième tas, qui croit à la
même vitesse que le premier décroît. Lorsque le premier tas a complètement
disparu, vous échangez les tas et démarrez une nouvelle séquence. Malin et plutôt
efficace !
Pour résumer, les tas sont des structures de données qu'il est bon de connaître. Je
les utilise dans quelques applications et je pense qu'il est bon de garder le
module heap sous le coude. ☺
Notes
1
Les algorithmes de répartition de charge pour les disques, courants de nos jours,
sont plus embêtants qu'utiles, en raison de la capacité des disques à réaliser des
accès aléatoires. Sur les périphériques qui ne peuvent faire que de la lecture
séquentielle, comme les gros lecteurs à bandes, le besoin était différent et il fallait
être malin pour s'assurer (bien à l'avance) que chaque mouvement de bande serait le
plus efficace possible (c'est-à-dire participerait au mieux à l'« avancée » de la
fusion). Certaines cassettes pouvaient même lire à l'envers et cela était aussi utilisé
pour éviter de remonter dans le temps. Croyez-moi, les bons tris sur bandes étaient
spectaculaires à regarder ! Depuis la nuit des temps, trier a toujours été le Grand
Art ! ☺
Ce module fournit des outils pour maintenir une liste triée sans avoir à la trier à
chaque insertion. Il pourrait être plus rapide que l'approche classique pour de
longues listes d'éléments dont les opérations de comparaison sont lourdes. Le
module se nomme bisect car il utilise une approche simple par bissection. Si vous
voulez un exemple de cet algorithme, le mieux est d'aller lire le code source de ce
module (les conditions sur les limites y étant justes !).
bisect.bisect_left(a, x, lo=0, hi=len(a))
bisect.bisect_right(a, x, lo=0, hi=len(a))
bisect.bisect(a, x, lo=0, hi=len(a))
Le point d'insertion renvoyé, i, coupe la liste a en deux moitiés telles que, pour la
moitié de gauche : all(val <= x for val in a[lo:i]) et pour la moitié de
droite : all(val > x for val in a[i:hi]).
bisect.insort_left(a, x, lo=0, hi=len(a))
bisect.insort_right(a, x, lo=0, hi=len(a))
bisect.insort(a, x, lo=0, hi=len(a))
Voir aussi
Autres Exemples
La fonction bisect() peut être utile pour des recherches dans des tableaux de
nombres. Cet exemple utilise bisect() pour rechercher la note (sous forme de
lettre) correspondant à un note sous forme de points, en se basant sur une échelle
prédéfinie : plus de 90 vaut 'A', de 80 à 89 vaut 'B', etc… :
>>>
Il est préférable d'utiliser une liste de clefs pré-calculée pour chercher l'index de
l'enregistrement en question :
>>>
>>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]
>>> data.sort(key=lambda r: r[1])
>>> keys = [r[1] for r in data] # precomputed list of
keys
>>> data[bisect_left(keys, 0)]
('black', 0)
>>> data[bisect_left(keys, 1)]
('blue', 1)
>>> data[bisect_left(keys, 5)]
('red', 5)
>>> data[bisect_left(keys, 8)]
('yellow', 8)
Caractère
'u' Py_UNICODE 2 (1)
Unicode
Notes :
Un nouveau tableau dont les éléments sont limités par typecode, et initialisés par la
valeur optionnelle initializer, qui peut être une liste, un bytes-like object, ou un
itérable sur des éléments du type approprié.
array.typecodes
array.typecode
Le code (de type Python caractère) utilisé pour spécifier le type des éléments du
tableau.
array.itemsize
array.append(x)
array.buffer_info()
Note
Lors de l'utilisation d'objets tableaux provenant de codes écrits en C ou C++ (le seul
moyen d'utiliser efficacement ces informations), il est plus logique d'utiliser l'interface
tampon supportée par les objets tableaux. Cette méthode est maintenue pour des
raisons de rétrocompatibilité et devrait être évitée dans un nouveau code. L'interface
tampon est documentée dans Protocole tampon.
array.byteswap()
Boutisme de tous les éléments du tableau. Ceci n'est pris en charge que pour les
valeurs de 1, 2, 4 ou 8 octets ; pour les autres types de valeur, RuntimeError est
levée. Il est utile lors de la lecture de données à partir d'un fichier écrit sur une
machine avec un ordre d'octets différent.
array.count(x)
array.extend(iterable)
array.frombytes(s)
array.fromfile(f, n)
Lit n éléments (en tant que valeurs machine) du file object f et les ajouter à la fin du
tableau. Si moins de n éléments sont disponibles, EOFError est levée, mais les
éléments qui étaient disponibles sont tout de même insérés dans le tableau. f doit
être un objet fichier natif ; quelque chose d'autre avec une méthode read() ne suffit
pas.
array.fromlist(list)
array.fromstring()
array.fromunicode(s)
Étend ce tableau avec les données de la chaîne Unicode donnée. Le tableau doit
être de type 'u' ; sinon ValueError est levée.
Utiliser array.frombytes(unicodestring.encode(enc)) pour ajouter des
données Unicode à un tableau d'un autre type.
array.index(x)
array.insert(i, x)
array.pop([i])
array.remove(x)
array.reverse()
array.tobytes()
Convertit le tableau en un tableau de valeurs machine et renvoie la représentation en
octets (la même séquence d'octets qui serait écrite par la méthode tofile()).
array.tofile(f)
Écrit tous les éléments (en tant que valeurs machine) du file object f.
array.tolist()
array.tostring()
array.tounicode()
Quand un objet tableau est affiché ou converti en chaîne, il est représenté en tant
que array(typecode, initializer). initializer est omis si le tableau est vide,
sinon c'est une chaine si le typecode est 'u', sinon c'est une liste de nombres. Il est
garanti que la chaîne puisse être convertie en un tableau avec le même type et la
même valeur en utilisant eval(), tant que la classe array a été importée en
utilisant from array import array. Exemples :
array('l')
array('u', 'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14])
Voir aussi
Module struct
A weak reference to an object is not enough to keep the object alive: when the only
remaining references to a referent are weak references, garbage collection is free to
destroy the referent and reuse its memory for something else. However, until the
object is actually destroyed the weak reference may return the object even if there
are no strong references to it.
A primary use for weak references is to implement caches or mappings holding large
objects, where it's desired that a large object not be kept alive solely because it
appears in a cache or mapping.
For example, if you have a number of large binary image objects, you may wish to
associate a name with each. If you used a Python dictionary to map names to
images, or images to names, the image objects would remain alive just because they
appeared as values or keys in the dictionaries.
The WeakKeyDictionary and WeakValueDictionary classes supplied by
the weakref module are an alternative, using weak references to construct
mappings that don't keep objects alive solely because they appear in the mapping
objects. If, for example, an image object is a value in a WeakValueDictionary, then
when the last remaining references to that image object are the weak references held
by weak mappings, garbage collection can reclaim the object, and its corresponding
entries in weak mappings are simply deleted.
Most programs should find that using one of these weak container types
or finalize is all they need -- it's not usually necessary to create your own weak
references directly. The low-level machinery is exposed by the weakref module for
the benefit of advanced uses.
Not all objects can be weakly referenced; those objects which can include class
instances, functions written in Python (but not in C), instance methods, sets,
frozensets, some file objects, generators, type objects, sockets, arrays, deques,
regular expression pattern objects, and code objects.
Modifié dans la version 3.2: Added support for thread.lock, threading.Lock, and code
objects.
class Dict(dict):
pass
Extension types can easily be made to support weak references; see Prise en charge
de la référence faible.
class weakref.ref(object[, callback])
Return a weak reference to object. The original object can be retrieved by calling the
reference object if the referent is still alive; if the referent is no longer alive, calling the
reference object will cause None to be returned. If callback is provided and not None,
and the returned weakref object is still alive, the callback will be called when the
object is about to be finalized; the weak reference object will be passed as the only
parameter to the callback; the referent will no longer be available.
It is allowable for many weak references to be constructed for the same object.
Callbacks registered for each weak reference will be called from the most recently
registered callback to the oldest registered callback.
Exceptions raised by the callback will be noted on the standard error output, but
cannot be propagated; they are handled in exactly the same way as exceptions
raised from an object's __del__() method.
Weak references are hashable if the object is hashable. They will maintain their hash
value even after the object was deleted. If hash() is called the first time only after
the object was deleted, the call will raise TypeError.
Weak references support tests for equality, but not ordering. If the referents are still
alive, two references have the same equality relationship as their referents
(regardless of the callback). If either referent has been deleted, the references are
equal only if the reference objects are the same object.
__callback__
This read-only attribute returns the callback currently associated to the weakref. If
there is no callback or if the referent of the weakref is no longer alive then this
attribute will have value None.
weakref.proxy(object[, callback])
Return a proxy to object which uses a weak reference. This supports use of the proxy
in most contexts instead of requiring the explicit dereferencing used with weak
reference objects. The returned object will have a type of
either ProxyType or CallableProxyType, depending on whether object is callable.
Proxy objects are not hashable regardless of the referent; this avoids a number of
problems related to their fundamentally mutable nature, and prevent their use as
dictionary keys. callback is the same as the parameter of the same name to
the ref() function.
weakref.getweakrefcount(object)
Return the number of weak references and proxies which refer to object.
weakref.getweakrefs(object)
Return a list of all weak reference and proxy objects which refer to object.
class weakref.WeakKeyDictionary([dict])
Mapping class that references keys weakly. Entries in the dictionary will be discarded
when there is no longer a strong reference to the key. This can be used to associate
additional data with an object owned by other parts of an application without adding
attributes to those objects. This can be especially useful with objects that override
attribute accesses.
WeakKeyDictionary.keyrefs()
class weakref.WeakValueDictionary([dict])
Mapping class that references values weakly. Entries in the dictionary will be
discarded when no strong reference to the value exists any more.
WeakValueDictionary.valuerefs()
class weakref.WeakSet([elements])
Set class that keeps weak references to its elements. An element will be discarded
when no strong reference to it exists any more.
class weakref.WeakMethod(method)
>>>
>>> class C:
... def method(self):
... print("method called!")
...
>>> c = C()
>>> r = weakref.ref(c.method)
>>> r()
>>> r = weakref.WeakMethod(c.method)
>>> r()
<bound method C.method of <__main__.C object at 0x7fc859830220>>
>>> r()()
method called!
>>> del c
>>> gc.collect()
0
>>> r()
>>>
class weakref.finalize(obj, func, *args, **kwargs)
Return a callable finalizer object which will be called when obj is garbage collected.
Unlike an ordinary weak reference, a finalizer will always survive until the reference
object is collected, greatly simplifying lifecycle management.
A finalizer will never invoke its callback during the later part of the interpreter
shutdown when module globals are liable to have been replaced by None.
__call__()
If self is alive then mark it as dead and return the result of
calling func(*args, **kwargs). If self is dead then return None.
detach()
If self is alive then mark it as dead and return the
tuple (obj, func, args, kwargs). If self is dead then return None.
peek()
If self is alive then return the tuple (obj, func, args, kwargs). If self is dead
then return None.
alive
Property which is true if the finalizer is alive, false otherwise.
atexit
A writable boolean property which by default is true. When the program exits, it calls
all remaining live finalizers for which atexit is true. They are called in reverse order
of creation.
Note
weakref.ReferenceType
weakref.ProxyType
The type object for proxies of objects which are not callable.
weakref.CallableProxyType
weakref.ProxyTypes
Sequence containing all the type objects for proxies. This can make it simpler to test
if an object is a proxy without being dependent on naming both proxy types.
Voir aussi
PEP 205 - Weak References
The proposal and rationale for this feature, including links to earlier implementations
and information about similar features in other languages.
>>> del o, o2
>>> print(r())
None
Testing that a weak reference object is still live should be done using the
expression ref() is not None. Normally, application code that needs to use a
reference object should follow this pattern:
Using a separate test for "liveness" creates race conditions in threaded applications;
another thread can cause a weak reference to become invalidated before the weak
reference is called; the idiom shown above is safe in threaded applications as well as
single-threaded applications.
import weakref
class ExtendedRef(weakref.ref):
def __init__(self, ob, callback=None, **annotations):
super(ExtendedRef, self).__init__(ob, callback)
self.__counter = 0
for k, v in annotations.items():
setattr(self, k, v)
def __call__(self):
"""Return a pair containing the referent and the number
of
times the reference has been called.
"""
ob = super(ExtendedRef, self).__call__()
if ob is not None:
self.__counter += 1
ob = (ob, self.__counter)
return ob
Exemple
This simple example shows how an application can use object IDs to retrieve objects
that it has seen before. The IDs of the objects can then be used in other data
structures without forcing the objects to remain alive, but the objects can still be
retrieved by ID if they do.
import weakref
_id2obj_dict = weakref.WeakValueDictionary()
def remember(obj):
oid = id(obj)
_id2obj_dict[oid] = obj
return oid
def id2obj(oid):
return _id2obj_dict[oid]
Finalizer Objects
The main benefit of using finalize is that it makes it simple to register a callback
without needing to preserve the returned finalizer object. For instance
The finalizer can be called directly as well. However the finalizer will invoke the
callback at most once.
Unless you set the atexit attribute to False, a finalizer will be called when the
program exits if it is still alive. For instance
class TempDir:
def __init__(self):
self.name = tempfile.mkdtemp()
def remove(self):
if self.name is not None:
shutil.rmtree(self.name)
self.name = None
@property
def removed(self):
return self.name is None
def __del__(self):
self.remove()
A more robust alternative can be to define a finalizer which only references the
specific functions and objects that it needs, rather than having access to the full state
of the object:
class TempDir:
def __init__(self):
self.name = tempfile.mkdtemp()
self._finalizer = weakref.finalize(self, shutil.rmtree,
self.name)
def remove(self):
self._finalizer()
@property
def removed(self):
return not self._finalizer.alive
Defined like this, our finalizer only receives a reference to the details it needs to clean
up the directory appropriately. If the object never gets garbage collected the finalizer
will still be called at exit.
The other advantage of weakref based finalizers is that they can be used to register
finalizers for classes where the definition is controlled by a third party, such as
running code when a module is unloaded:
If you create a finalizer object in a daemonic thread just as the program exits then
there is the possibility that the finalizer does not get called at exit. However, in a
daemonic
thread atexit.register(), try: ... finally: ... and with: ... do not
guarantee that cleanup occurs either.
This module defines utility functions to assist in dynamic creation of new types.
It also defines names for some object types that are used by the standard Python
interpreter, but not exposed as builtins like int or str are.
Finally, it provides some additional type-related utility classes and functions that are
not fundamental enough to be builtins.
The first three arguments are the components that make up a class definition header:
the class name, the base classes (in order), the keyword arguments (such
as metaclass).
types.prepare_class(name, bases=(), kwds=None)
Calculates the appropriate metaclass and creates the class namespace.
The arguments are the components that make up a class definition header: the class
name, the base classes (in order) and the keyword arguments (such as metaclass).
Voir aussi
Méta-classes
This function looks for items in bases that are not instances of type, and returns a
tuple where each such object that has an __mro_entries__ method is replaced
with an unpacked result of calling this method. If a bases item is an instance of type,
or it doesn't have an __mro_entries__ method, then it is included in the return
tuple unchanged.
Voir aussi
PEP 560 — Gestion de base pour les types modules et les types génériques
Standard Interpreter Types
This module provides names for many of the types that are required to implement a
Python interpreter. It deliberately avoids including some of the types that arise only
incidentally during processing such as the listiterator type.
types.FunctionType
types.LambdaType
types.GeneratorType
types.CoroutineType
types.AsyncGeneratorType
types.CodeType
types.MethodType
types.BuiltinFunctionType
types.BuiltinMethodType
The type of methods of some built-in data types and base classes such
as object.__init__() or object.__lt__().
types.MethodWrapperType
The type of bound methods of some built-in data types and base classes. For
example it is the type of object().__str__.
types.MethodDescriptorType
types.ClassMethodDescriptorType
class types.ModuleType(name, doc=None)
The type of modules. Constructor takes the name of the module to be created and
optionally its docstring.
Note
__loader__
The loader which loaded the module. Defaults to None.
Modifié dans la version 3.4: Defaults to None. Previously the attribute was optional.
__name__
The name of the module.
__package__
Which package a module belongs to. If the module is top-level (i.e. not a part of any
specific package) then the attribute should be set to '', else it should be set to the
name of the package (which can be __name__ if the module is a package itself).
Defaults to None.
Modifié dans la version 3.4: Defaults to None. Previously the attribute was optional.
class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)
See the language reference for details of the available attributes and operations, and
guidance on creating tracebacks dynamically.
types.FrameType
types.GetSetDescriptorType
types.MemberDescriptorType
key in proxy
Return True if the underlying mapping has a key key, else False.
proxy[key]
Return the item of the underlying mapping with key key. Raises a KeyError if key is
not in the underlying mapping.
iter(proxy)
Return an iterator over the keys of the underlying mapping. This is a shortcut
for iter(proxy.keys()).
len(proxy)
Return the number of items in the underlying mapping.
copy()
Return a shallow copy of the underlying mapping.
get(key[, default])
Return the value for key if key is in the underlying mapping, else default. If default is
not given, it defaults to None, so that this method never raises a KeyError.
items()
Return a new view of the underlying mapping's items ( (key, value) pairs).
keys()
Return a new view of the underlying mapping's keys.
values()
Return a new view of the underlying mapping's values.
class SimpleNamespace:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __repr__(self):
keys = sorted(self.__dict__)
items = ("{}={!r}".format(k, self.__dict__[k]) for k in
keys)
return "{}({})".format(type(self).__name__, ",
".join(items))
types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None
)
Route attribute access on a class to __getattr__.
This is a descriptor, used to define attributes that act differently when accessed
through an instance and through a class. Instance access remains normal, but
access to an attribute through a class will be routed to the class's __getattr__
method; this is done by raising AttributeError.
This allows one to have properties active on an instance, and have virtual attributes
on the class with the same name (see Enum for an example).
Les instructions d'affectation en Python ne copient pas les objets, elles créent des
liens entre la cible et l'objet. Concernant les collections qui sont muables ou
contiennent des éléments muables, une copie est parfois nécessaire, pour pouvoir
modifier une copie sans modifier l'autre. Ce module met à disposition des opérations
de copie génériques superficielle et récursive (comme expliqué ci-dessous).
Résumé de l'interface :
copy.copy(x)
copy.deepcopy(x[, memo])
exception copy.error
La différence entre copie superficielle et récursive n'est pertinente que pour les
objets composés (objets contenant d'autres objets, comme des listes ou des
instances de classe) :
Une copie superficielle construit un nouvel objet composé puis (dans la
mesure du possible) insère dans l'objet composé des références aux objets trouvés
dans l'original.
Une copie récursive (ou profonde) construit un nouvel objet composé puis,
récursivement, insère dans l'objet composé des copies des objets trouvés dans
l'objet original.
On rencontre souvent deux problèmes avec les opérations de copie récursive qui
n'existent pas avec les opérations de copie superficielle :
Ce module ne copie pas les types tels que module, méthode, trace d'appels, cadre
de pile, fichier, socket, fenêtre, tableau, ou tout autre type similaire. Il "copie" les
fonctions et les classes (superficiellement et récursivement), en retournant l'objet
original inchangé ; c'est compatible avec la manière dont ils sont traités par le
module pickle.
Les classes peuvent utiliser les mêmes interfaces de contrôle que celles utilisées
pour la sérialisation. Voir la description du module pickle pour plus d'informations
sur ces méthodes. En effet, le module copy utilise les fonctions de sérialisation
enregistrées à partir du module copyreg.
Afin qu'une classe définisse sa propre implémentation de copie, elle peut définir les
méthodes spéciales __copy__() et __deepcopy__(). La première est appelée
pour implémenter l'opération de copie superficielle ; aucun argument supplémentaire
n'est passé. La seconde est appelée pour implémenter l'opération de copie
récursive ; elle reçoit un argument, le dictionnaire memo. Si l'implémentation
de __deepcopy__() a besoin de faire une copie récursive d'un composant, elle doit
appeler la fonction deepcopy() avec le composant comme premier argument et le
dictionnaire memo comme second argument.
Voir aussi
Module pickle
L’affichage formaté affiche tant que possible les objets sur une seule ligne, et les
sépare sur plusieurs lignes s’ils dépassent la largeur autorisée par l’interpréteur.
Créez explicitement des objets PrettyPrinter si vous avez besoin de modifier les
limites de largeur.
Les dictionnaires sont classés par clés avant que l’affichage ne soit calculé.
class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, c
ompact=False)
pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False)
Renvoie une représentation formatée de object sous forme de chaine de
caractères. indent, width, depth et compact sont passés au constructeur
de PrettyPrinter comme paramètres de formatage.
pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=Fal
se)
>>> pprint.isreadable(stuff)
False
pprint.isrecursive(object)
pprint.saferepr(object)
>>> pprint.saferepr(stuff)
"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack',
'knights', 'ni']"
PrettyPrinter.pformat(object)
PrettyPrinter.pprint(object)
Affiche sur le flux configuré la représentation formatée de object, suivie d’une fin de
ligne.
PrettyPrinter.isreadable(object)
PrettyPrinter.isrecursive(object)
PrettyPrinter.format(object, context, maxlevels, level)
Renvoie trois valeurs : la version formatée de object sous forme de chaîne de
caractères, une option indiquant si le résultat est « lisible », et une option indiquant si
une récursion a été détectée. Le premier argument est l’objet à représenter. Le
deuxième est un dictionnaire qui contient l' id() des objets (conteneurs directs ou
indirects de objet qui affectent sa représentation) qui font partie du contexte de
représentation courant tel que les clés; si un objet doit être représenté, mais l’a déjà
été dans ce contexte, le troisième argument renvoie True. Des appels récursifs à la
méthode format() doivent ajouter des entrés additionnelles aux conteneurs de ce
dictionnaire. Le troisième argument maxlevels, donne la limite maximale de
récursivité; la valeur par défaut est 0. Cet argument doit être passé non modifié pour
des appels non récursifs. Le quatrième argument, level, donne le niveau de
récursivité courant; les appels récursifs doivent être passés à une valeur inférieure à
celle de l’appel courant.
Exemple
Pour illustrer quelques cas pratiques de l’utilisation de la fonction pprint() et de
ses paramètres, allons chercher des informations sur un projet PyPI :
>>>
>>>
>>> pprint.pprint(project_info)
{'author': 'The Python Packaging Authority',
'author_email': 'pypa-dev@googlegroups.com',
'bugtrack_url': None,
'classifiers': ['Development Status :: 3 - Alpha',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Topic :: Software Development :: Build Tools'],
'description': 'A sample Python project\n'
'=======================\n'
'\n'
'This is the description file for the project.\n'
'\n'
'The file should use UTF-8 encoding and be
written using '
'ReStructured Text. It\n'
'will be used to generate the project webpage on
PyPI, and '
'should be written for\n'
'that purpose.\n'
'\n'
'Typical contents for this file would include an
overview of '
'the project, basic\n'
'usage examples, etc. Generally, including the
project '
'changelog in here is not\n'
'a good idea, although a simple "What\'s New"
section for the '
'most recent version\n'
'may be appropriate.',
'description_content_type': None,
'docs_url': None,
'download_url': 'UNKNOWN',
'downloads': {'last_day': -1, 'last_month': -1, 'last_week':
-1},
'home_page': 'https://github.com/pypa/sampleproject',
'keywords': 'sample setuptools development',
'license': 'MIT',
'maintainer': None,
'maintainer_email': None,
'name': 'sampleproject',
'package_url': 'https://pypi.org/project/sampleproject/',
'platform': 'UNKNOWN',
'project_url': 'https://pypi.org/project/sampleproject/',
'project_urls': {'Download': 'UNKNOWN',
'Homepage':
'https://github.com/pypa/sampleproject'},
'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
'requires_dist': None,
'requires_python': None,
'summary': 'A sample Python project',
'version': '1.2.0'}
Le résultat peut être limité à une certaine profondeur en initialisant depth. ( … est
utilisé pour des contenus plus « profonds ») :
>>>
De plus, une valeur maximale de caractères sur une ligne peut être définie en
initialisant le paramètre width. Si un long objet ne peut être scindé, la valeur donnée
à width sera outrepassée :
>>>
reprlib ---
Alternate repr() implementation
Code source : Lib/reprlib.py
class reprlib.Repr
reprlib.aRepr
reprlib.repr(obj)
In addition to size-limiting tools, the module also provides a decorator for detecting
recursive calls to __repr__() and substituting a placeholder string instead.
@reprlib.recursive_repr(fillvalue="...")
Decorator for __repr__() methods to detect recursive calls within the same thread.
If a recursive call is made, the fillvalue is returned, otherwise, the
usual __repr__() call is made. For example:
Repr Objects
Repr instances provide several attributes which can be used to provide size limits for
the representations of different object types, and methods which format specific
object types.
Repr.maxlevel
Repr.maxdict
Repr.maxlist
Repr.maxtuple
Repr.maxset
Repr.maxfrozenset
Repr.maxdeque
Repr.maxarray
Limits on the number of entries represented for the named object type. The default
is 4 for maxdict, 5 for maxarray, and 6 for the others.
Repr.maxlong
Maximum number of characters in the representation for an integer. Digits are
dropped from the middle. The default is 40.
Repr.maxstring
Limit on the number of characters in the representation of the string. Note that the
"normal" representation of the string is used as the character source: if escape
sequences are needed in the representation, these may be mangled when the
representation is shortened. The default is 30.
Repr.maxother
This limit is used to control the size of object types for which no specific formatting
method is available on the Repr object. It is applied in a similar manner
as maxstring. The default is 20.
Repr.repr(obj)
Repr.repr1(obj, level)
Recursive implementation used by repr(). This uses the type of obj to determine
which formatting method to call, passing it obj and level. The type-specific methods
should call repr1() to perform recursive formatting, with level - 1 for the value
of level in the recursive call.
Repr.repr_TYPE(obj, level)
Formatting methods for specific types are implemented as methods with a name
based on the type name. In the method name, TYPE is replaced
by '_'.join(type(obj).__name__.split()). Dispatch to these methods is
handled by repr1(). Type-specific methods which need to recursively format a
value should call self.repr1(subobj, level - 1).
import reprlib
import sys
class MyRepr(reprlib.Repr):
aRepr = MyRepr()
print(aRepr.repr(sys.stdin)) # prints '<stdin>'
enum — Énumerations
Nouveau dans la version 3.4.
Code source : Lib/enum.py
Contenu du module
Ce module définit quatre classes d'énumération qui permettent de définir des
ensembles uniques de noms et de valeurs : Enum, IntEnum, Flag et IntFlag. Il
fournit également un décorateur, unique(), ainsi qu'une classe utilitaire, auto.
class enum.Enum
Classe de base pour créer une énumération de constantes. Voir la section API par
fonction pour une syntaxe alternative de construction.
class enum.IntEnum
Classe de base pour créer une énumération de constantes qui sont également des
sous-classes de int.
class enum.IntFlag
Classe de base pour créer une énumération de constantes pouvant être combinées
avec des opérateurs de comparaison bit-à-bit, sans perdre leur qualité de IntFlag.
Les membres de IntFlag sont aussi des sous-classes de int.
class enum.Flag
Classe de base pour créer une énumération de constantes pouvant être combinées
avec des opérateurs de comparaison bit-à-bit, sans perdre leur qualité de Flag.
enum.unique()
Décorateur de classe qui garantit qu'une valeur ne puisse être associée qu'à un seul
nom.
class enum.auto
Instances are replaced with an appropriate value for Enum members. Initial value
starts at 1.
Création d'une Enum
Une énumération est créée comme une class, ce qui la rend facile à lire et à écrire.
Une autre méthode de création est décrite dans API par fonction. Pour définir une
énumération, il faut hériter de Enum de la manière suivante :
>>>
La valeur d'un membre peut être de n'importe quel type : int, str, etc. Si la valeur
exacte n'a pas d'importance, utilisez des instances de auto et une valeur appropriée
sera choisie pour vous. Soyez vigilant si vous mélangez auto avec d'autres valeurs.
Note
Nomenclature
La classe Color est une énumération (ou un enum).
Les attributs Color.RED, Color.GREEN, etc., sont les membres de
l'énumération (ou les membres de l'enum) et sont fonctionnellement des constantes.
Les membres de l'enum ont chacun un nom et une valeur ; le nom
de Color.RED est RED, la valeur de Color.BLUE est 3, etc.
Note
>>>
>>> print(Color.RED)
Color.RED
>>>
>>> print(repr(Color.RED))
<Color.RED: 1>
>>>
>>> type(Color.RED)
<enum 'Color'>
>>> isinstance(Color.GREEN, Color)
True
>>>
>>>
>>> print(Color.RED.name)
RED
Les énumérations sont itérables, l'ordre d'itération est celui dans lequel les membres
sont déclarés :
>>>
Les membres d'une énumération sont hachables, ils peuvent ainsi être utilisés dans
des dictionnaires ou des ensembles :
>>>
>>> apples = {}
>>> apples[Color.RED] = 'red delicious'
>>> apples[Color.GREEN] = 'granny smith'
>>> apples == {Color.RED: 'red delicious', Color.GREEN: 'granny
smith'}
True
>>>
>>> Color(1)
<Color.RED: 1>
>>> Color(3)
<Color.BLUE: 3>
Pour accéder aux membres par leur nom, utilisez l'accès par indexation :
>>>
>>> Color['RED']
<Color.RED: 1>
>>> Color['GREEN']
<Color.GREEN: 2>
>>>
>>>
>>>
Il est interdit de créer un membre avec le même nom qu'un attribut déjà défini (un
autre membre, une méthode, etc.) ou de créer un attribut avec le nom d'un membre.
@enum.unique
>>>
Valeurs automatiques
Si la valeur exacte n'a pas d'importance, vous pouvez utiliser auto :
>>>
>>>
Itération
Itérer sur les membres d'une énumération ne parcourt pas les alias :
>>>
>>> list(Shape)
[<Shape.SQUARE: 2>, <Shape.DIAMOND: 1>, <Shape.CIRCLE: 3>]
>>>
>>>
Comparaisons
Les membres d'une énumération sont comparés par identité :
>>>
Les comparaisons d'ordre entre les valeurs d'une énumération n'existent pas ; les
membres d'un enum ne sont pas des entiers (voir cependant IntEnum ci-dessous) :
>>>
>>>
Les comparaisons avec des valeurs ne provenant pas d'énumérations sont toujours
fausses (ici encore, IntEnum a été conçue pour fonctionner différemment, voir ci-
dessous) :
>>>
>>> Color.BLUE == 2
False
Les énumérations sont des classes Python et peuvent donc avoir des méthodes et
des méthodes spéciales. L'énumération suivante :
>>>
amène :
>>>
>>> Mood.favorite_mood()
<Mood.HAPPY: 3>
>>> Mood.HAPPY.describe()
('HAPPY', 3)
>>> str(Mood.FUNKY)
'my custom str! 1'
Les règles pour ce qui est autorisé sont les suivantes : les noms qui commencent et
finissent avec un seul tiret bas sont réservés par enum et ne peuvent pas être
utilisés ; tous les autres attributs définis dans l'énumération en deviendront des
membres, à l'exception des méthodes spéciales ( __str__(), __add__(), etc.), des
descripteurs (les méthodes sont aussi des descripteurs) et des noms de variable
listés dans _ignore_.
Hériter d'une énumération n'est permis que si cette énumération ne définit aucun
membre. Le code suivant n'est pas autorisé :
>>>
>>> class MoreColor(Color):
... PINK = 17
...
Traceback (most recent call last):
...
TypeError: Cannot extend enumerations
>>>
Autoriser l'héritage d'enums définissant des membres violerait des invariants sur les
types et les instances. D'un autre côté, il est logique d'autoriser un groupe
d'énumérations à partager un comportement commun (voir par
exemple OrderedEnum).
Sérialisation
Les énumérations peuvent être sérialisées et déserialisées :
>>>
Note
>>>
>>>
>>>
Le nouveau protocole version 4 de pickle se base lui aussi, dans certains cas, sur le
fait que __qualname__ pointe sur l'endroit où pickle peut trouver la classe. Par
exemple, si la classe était disponible depuis la classe SomeData dans l'espace de
nom de plus haut niveau :
>>>
Les membres de l'énumération. Une chaîne de caractères séparés par des espaces
ou des virgules (la valeur de départ est fixée à 1, sauf si spécifiée autrement) :
'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE'
ou un itérateur sur les noms :
['RED', 'GREEN', 'BLUE']
ou un itérateur sur les tuples (nom, valeur) :
[('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)]
ou une correspondance :
{'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42}
module
Énumérations dérivées
IntEnum
La première version dérivée de Enum qui existe est aussi une sous-classe de int.
Les membres de IntEnum peuvent être comparés à des entiers et, par extension, les
comparaisons entre des énumérations entières de type différent sont possibles :
>>>
>>>
>>> class Shape(IntEnum):
... CIRCLE = 1
... SQUARE = 2
...
>>> class Color(Enum):
... RED = 1
... GREEN = 2
...
>>> Shape.CIRCLE == Color.RED
False
Les valeurs de IntEnum se comportent comme des entiers, comme on pouvait s'y
attendre :
>>>
>>> int(Shape.CIRCLE)
1
>>> ['a', 'b', 'c'][Shape.CIRCLE]
'b'
>>> [i for i in range(Shape.SQUARE)]
[0, 1]
IntFlag
La version dérivée suivante de Enum est IntFlag. Elle est aussi basée sur int, à la
différence près que les membres de IntFlag peuvent être combinés en utilisant les
opérateurs bit-à-bit (&, |, ^, ~) et que le résultat reste un membre de IntFlag.
Cependant, comme le nom l'indique, les membres d'une classe IntFlag héritent
aussi de int et peuvent être utilisés là où un int est utilisé. Toute opération sur un
membre d'une classe IntFlag, autre qu'un opérateur bit-à-bit lui fait perdre sa
qualité de IntFlag.
>>>
>>>
>>>
Comme les membres d'une classe IntFlag héritent aussi de int, ils peuvent être
combinés avec eux :
>>>
>>> Perm.X | 8
<Perm.8|X: 9>
Option
La dernière version dérivée est la classe Flag. Comme IntFlag, les membres
d'une classe Flag peuvent être combinés en utilisant les opérateurs de comparaison
bit-à-bit. Cependant, à la différence de IntFlag, ils ne peuvent ni être combinés, ni
être comparés avec une autre énumération Flag, ni avec int. Bien qu'il soit possible
de définir directement les valeurs, il est recommandé d'utiliser auto comme valeur et
de laisser Flag choisir une valeur appropriée.
Nouveau dans la version 3.6.
>>>
Les options de base doivent avoir des puissances de deux pour valeurs (1, 2, 4,
8, ...) mais pas les combinaisons :
>>>
>>>
Ceci montre comment définir des énumérations dérivées similaires ; par exemple
une classe StrEnum qui dériverait de str au lieu de int.
Quelques règles :
1. Pour hériter de Enum, les types de mélange doivent être placés avant la
classe Enum elle-même dans la liste des classes de base, comme dans l'exemple
de IntEnum ci-dessus.
2. Même si une classe Enum peut avoir des membres de n'importe quel type, dès
lors qu'un type de mélange est ajouté, tous les membres doivent être de ce type, p.
ex. int ci-dessus. Cette restriction ne s'applique pas aux types de mélange qui ne
font qu'ajouter des méthodes et ne définissent pas de type de données,
tels int ou str.
3. Quand un autre type de données est mélangé,
l'attribut value n'est pas identique au membre de l'énumération lui-même, bien qu'ils
soient équivalents et égaux en comparaison.
4. Formatage de style % : %s et %r appellent respectivement les
méthodes __str__() et __repr__() de la classe Enum ; les autres codes,
comme %i ou %h pour IntEnum, s'appliquent au membre comme si celui-ci était
converti en son type de mélange.
5. Chaînes de caractères formatées
littérales : str.format() et format() appellent la méthode __format__() du type
de mélange. Pour appeler les fonctions str() ou repr() de la classe Enum, il faut
utiliser les codes de formatage !s ou !r.
Exemples intéressants
Bien que Enum, IntEnum, IntFlag et Flag soient conçues pour répondre à la
majorité des besoins, elles ne peuvent répondre à tous. Voici quelques recettes
d'énumération qui peuvent être réutilisées telles quelles, ou peuvent servir d'exemple
pour développer vos propres énumérations.
Utiliser une de ces méthodes indique à l'utilisateur que les valeurs n'ont pas
d'importance. Cela permet aussi d'ajouter, de supprimer ou de ré-ordonner les
membres sans avoir à ré-énumérer les membres existants.
Quelle que soit la méthode choisie, il faut fournir une méthode repr() qui masque
les valeurs (pas importantes de toute façon) :
>>>
>>>
>>>
>>>
>>>
>>>
DuplicateFreeEnum
Lève une erreur si un membre est dupliqué, plutôt que de créer un alias :
>>>
>>>
TimePeriod
Exemple d'utilisation de l'attribut _ignore_ :
>>>
Aspects approfondis
Noms de la forme __dunder__ disponibles
__members__ est une OrderedDict de
correspondances nom_du_membre / membre. Elle n'est disponible que depuis la
classe.
>>>
>>>
def __bool__(self):
return bool(self.value)
>>>
>>> dir(Planet)
['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN',
'URANUS', 'VENUS', '__class__', '__doc__', '__members__',
'__module__']
>>> dir(Planet.EARTH)
['__class__', '__doc__', '__module__', 'name', 'surface_gravity',
'value']
Combinaison de membres de Flag
>>>
class numbers.Number
La base de la hiérarchie numérique. Si vous voulez juste vérifier qu'un
argument x est un nombre, peu importe le type, utilisez isinstance(x, Number).
La tour numérique
class numbers.Complex
real
Abstrait. Récupère la partie réelle de ce nombre.
imag
Abstrait. Retrouve la partie imaginaire de ce nombre.
abstractmethod conjugate()
class numbers.Real
Real ajoute les opérations qui fonctionnent sur les nombres réels à Complex.
class numbers.Rational
numerator
Abstrait.
denominator
Abstrait.
class numbers.Integral
Dérive Rational et ajoute une conversion en int. Fournit des valeurs par défaut
pour float(), numerator et denominator. Ajoute des méthodes abstraites
pour ** et les opérations au niveau des bits: <<, >>, &, ^, |, ~.
def __hash__(self):
if self.denominator == 1:
# Get integers right.
return hash(self.numerator)
# Expensive check, but definitely correct.
if self == float(self):
return hash(float(self))
else:
# Use tuple's hash to avoid a high collision rate on
# simple fractions.
return hash((self.numerator, self.denominator))
class MyIntegral(Integral):
Il existe 5 cas différents pour une opération de type mixte sur des sous-classes
de Complex. Nous nous référerons à tout le code ci-dessus qui ne se réfère pas
à MyIntegral et OtherTypeIKnowAbout comme "expression générique". a est une
instance de A, qui est un sous-type de Complex (a : A <: Complex)
et b : B <: Complex. Considérons a + b:
# ...
Les fonctions suivantes sont fournies dans ce module. Sauf mention contraire
explicite, toutes les valeurs de retour sont des flottants.
Renvoie la partie entière par excès de x, le plus petit entier supérieur ou égal à x.
Si x est un flottant, délègue à x.__ceil()__, qui doit renvoyer une
valeur Integral.
math.copysign(x, y)
math.fabs(x)
math.factorial(x)
math.floor(x)
Renvoie la partie entière (par défaut) de x, le plus grand entier inférieur ou égal à x.
Si x n'est pas un flottant, délègue à x.__floor()__, qui doit renvoyer une
valeur Integral.
math.fmod(x, y)
math.frexp(x)
math.fsum(iterable)
Renvoie une somme flottante exacte des valeurs dans l'itérable. Évite la perte de
précision en gardant plusieurs sommes partielles intermédiaires :
>>>
>>> sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
0.9999999999999999
>>> fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
1.0
math.gcd(a, b)
math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
Déterminer si deux valeurs sont considérées comme « proches » se fait à l'aide des
tolérances absolues et relatives passées en paramètres.
Voir aussi
math.isinf(x)
math.isnan(x)
Renvoie True si x est NaN (Not a Number, ou Pas un Nombre en français),
et False sinon.
math.ldexp(x, i)
math.modf(x)
Renvoie les parties entière et fractionnelle de x. Les deux résultats ont le signe
de x et sont flottants.
math.remainder(x, y)
Renvoie le reste selon la norme IEEE 754 de x par rapport à y. Pour x fini et y fini
non nul, il s'agit de la différence x - n*y, où n est l'entier le plus proche de la valeur
exacte du quotient x / y. Si x / y est exactement à mi-chemin de deux entiers
consécutifs, le plus proche entier pair est utilisé pour n. Ainsi, le
reste r = remainder(x, y) vérifie toujours abs(r) <= 0.5 * abs(y).
Sur les plates-formes utilisant la norme IEEE 754 pour les nombres à virgule flottante
en binaire, le résultat de cette opération est toujours exactement représentable :
aucune erreur d'arrondi n'est introduite.
math.trunc(x)
math.expm1(x)
>>>
math.log(x[, base])
math.log1p(x)
math.log2(x)
math.pow(x, y)
math.sqrt(x)
Fonctions trigonométriques
math.acos(x)
math.asin(x)
math.atan(x)
math.atan2(y, x)
math.cos(x)
math.hypot(x, y)
math.sin(x)
math.tan(x)
Conversion angulaire
math.degrees(x)
math.radians(x)
Fonctions hyperboliques
Les fonctions hyperboliques sont analogues à des fonctions trigonométriques qui
sont basées sur des hyperboles au lieu de cercles.
math.acosh(x)
math.asinh(x)
math.atanh(x)
math.sinh(x)
math.tanh(x)
Fonctions spéciales
math.erf(x)
def phi(x):
'Cumulative distribution function for the standard normal
distribution'
return (1.0 + erf(x / sqrt(2.0))) / 2.0
math.erfc(x)
math.gamma(x)
math.lgamma(x)
math.e
math.tau
math.inf
math.nan
Note
Sur les plate-formes avec un support système et matériel des zéros signés, les
fonctions incluant une coupure complexe sont continues de chaque côté de la
coupure : le signe du zéro distingue les deux extrémités de la coupure. Sur les plate-
formes ne supportant pas les zéros signés, la continuité est spécifiée en-dessous.
z == z.real + z.imag*1j
Les fonctions suivantes peuvent être utilisées pour convertir à partir des
coordonnées rectangulaires natives vers les coordonnées polaires, et vice-versa.
cmath.phase(x)
>>>
cmath.rect(r, phi)
cmath.log10(x)
cmath.sqrt(x)
Fonctions trigonométriques
cmath.acos(x)
Renvoie l'arc cosinus de x. Il y a deux coupures : une allant de 1 sur l'axe réel vers
∞, continue par en-dessous ; l'autre allant de -1 sur l'axe réel vers -∞, continue par
au-dessus.
cmath.asin(x)
cmath.atan(x)
Renvoie la tangente de x. l y a deux coupures : une allant de 1j sur l'axe imaginaire
vers ∞j, continue par la droite ; l'autre allant de -1j sur l'axe imaginaire vers -∞j,
continue par la gauche.
cmath.cos(x)
cmath.sin(x)
cmath.tan(x)
Fonctions hyperboliques
cmath.acosh(x)
Renvoie l'arc cosinus hyperbolique de x. Il y a une coupure, allant de 1 sur l'axe réel
vers -∞, continue par au-dessus.
cmath.asinh(x)
Renvoie l'arc sinus hyperbolique de x. Il y a deux coupures : une allant de 1j sur
l'axe imaginaire vers ∞j, continue par la droite ; l'autre allant de -1j sur l'axe
imaginaire vers ∞j, continue par la gauche.
cmath.atanh(x)
Renvoie l'arc tangente hyperbolique de x. Il y a deux coupures : une allant de 1 sur
l'axe réel allant vers ∞, continue par en-dessous ; l'autre allant de -1 sur l'axe réel
vers -∞, continue par au-dessus.
cmath.cosh(x)
cmath.sinh(x)
cmath.tanh(x)
Fonctions de classifications
cmath.isfinite(x)
cmath.isinf(x)
cmath.isnan(x)
cmath.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
Renvoie True si les valeurs a et b sont proches l'une de l'autre, et False sinon.
Déterminer si deux valeurs sont proches se fait à l'aide des tolérances absolues et
relatives données en paramètres.
Voir aussi
Constantes
cmath.pi
cmath.e
cmath.tau
cmath.inf
Nombre à virgule flottante positif infini. Équivaut à float('inf').
cmath.infj
Nombre complexe dont la partie réelle vaut zéro et la partie imaginaire un infini
positif. Équivalent à complex(0.0, float('inf')).
cmath.nan
cmath.nanj
Nombre complexe dont la partie réelle vaut zéro et la partie imaginaire vaut un NaN.
Équivalent à complex(0.0, float('nan')).
Notez que la sélection de fonctions est similaire, mais pas identique, à celles du
module math. La raison d'avoir deux modules est que certains utilisateurs ne sont
pas intéressés par les nombres complexes, et peut-être ne savent même pas ce
qu'ils sont. Ils préféreraient alors que math.sqrt(-1) lève une exception au lieu de
renvoyer un nombre complexe. Également, notez que les fonctions définies
dans cmath renvoient toujours un nombre complexe, même si le résultat peut être
exprimé à l'aide d'un nombre réel (en quel cas la partie imaginaire du complexe vaut
zéro).
Une note sur les coupures : ce sont des courbes sur lesquelles la fonction n'est pas
continue. Ce sont des caractéristiques nécessaires de beaucoup de fonctions
complexes. Il est supposé que si vous avez besoin d'utiliser des fonctions
complexes, vous comprendrez ce que sont les coupures. Consultez n'importe quel
livre (pas trop élémentaire) sur les variables complexes pour plus d'informations.
Pour des informations sur les choix des coupures à des fins numériques, voici une
bonne référence :
Voir aussi
Kahan, W: Branch cuts for complex elementary functions; or, Much ado about
nothing's sign bit. In Iserles, A., and Powell, M. (eds.), The state of the art in
numerical analysis. Clarendon Press (1987) pp165--211.
Les signaux sont des groupes de conditions exceptionnelles qui surviennent durant
le calcul. Selon les besoins de l'application, les signaux peuvent être ignorés,
considérés comme de l'information, ou bien traités comme des exceptions. Les
signaux dans le
module decimal sont : Clamped, InvalidOperation, DivisionByZero, Inexact
, Rounded, Subnormal, Overflow, Underflow et FloatOperation.
Voir aussi
La spécification d'IBM sur l'arithmétique décimale : The General Decimal
Arithmetic Specification.
Introduction pratique
Commençons par importer le module, regarder le contexte actuel
avec getcontext(), et si nécessaire configurer la précision, l'arrondi, et la gestion
des signaux :
>>>
>>>
>>> getcontext().prec = 28
>>> Decimal(10)
Decimal('10')
>>> Decimal('3.14')
Decimal('3.14')
>>> Decimal(3.14)
Decimal('3.140000000000000124344978758017532527446746826171875')
>>> Decimal((0, (3, 1, 4), -2))
Decimal('3.14')
>>> Decimal(str(2.0 ** 0.5))
Decimal('1.4142135623730951')
>>> Decimal(2) ** Decimal('0.5')
Decimal('1.414213562373095048801688724')
>>> Decimal('NaN')
Decimal('NaN')
>>> Decimal('-Infinity')
Decimal('-Infinity')
>>>
>>> c = getcontext()
>>> c.traps[FloatOperation] = True
>>> Decimal(3.14)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
>>> Decimal('3.5') < 3.7
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
>>> Decimal('3.5') == 3.5
True
>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
>>>
>>> Decimal("1e9999999999999999999")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
>>> getcontext().prec = 28
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724')
>>> Decimal(1).exp()
Decimal('2.718281828459045235360287471')
>>> Decimal('10').ln()
Decimal('2.302585092994045684017991455')
>>> Decimal('10').log10()
Decimal('1')
>>> Decimal('7.325').quantize(Decimal('.01'),
rounding=ROUND_DOWN)
Decimal('7.32')
>>> Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP)
Decimal('8')
Pour un travail plus avancé, il peut être utile de créer des contextes alternatifs en
utilisant le constructeur de Context. Pour activer cet objet Context, utilisez la
fonction setcontext().
>>> ExtendedContext
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999,
Emax=999999,
capitals=1, clamp=0, flags=[], traps=[])
>>> setcontext(ExtendedContext)
>>> Decimal(1) / Decimal(7)
Decimal('0.142857143')
>>> Decimal(42) / Decimal(0)
Decimal('Infinity')
>>> setcontext(BasicContext)
>>> Decimal(42) / Decimal(0)
Traceback (most recent call last):
File "<pyshell#143>", line 1, in -toplevel-
Decimal(42) / Decimal(0)
DivisionByZero: x / 0
Les objets Context ont aussi des options pour détecter des opérations illégales lors
des calculs. Ces options restent activées jusqu'à ce qu'elles soit remises à zéro de
manière explicite. Il convient donc de remettre à zéro ces options avant chaque
inspection de chaque calcul, avec la méthode clear_flags().
>>>
>>> setcontext(ExtendedContext)
>>> getcontext().clear_flags()
>>> Decimal(355) / Decimal(113)
Decimal('3.14159292')
>>> getcontext()
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999,
Emax=999999,
capitals=1, clamp=0, flags=[Inexact, Rounded], traps=[])
Les options montrent que l'approximation de Pi par une fraction a été arrondie (les
chiffres au delà de la précision spécifiée par l'objet Context ont été tronqués) et que
le résultat est différent (certains des chiffres tronqués étaient différents de zéro).
>>> setcontext(ExtendedContext)
>>> Decimal(1) / Decimal(0)
Decimal('Infinity')
>>> getcontext().traps[DivisionByZero] = 1
>>> Decimal(1) / Decimal(0)
Traceback (most recent call last):
File "<pyshell#112>", line 1, in -toplevel-
Decimal(1) / Decimal(0)
DivisionByZero: x / 0
Les chiffres codés en Unicode sont aussi autorisés, là ou digit apparaît. Cela inclut
des chiffres décimaux venant d'autres alphabets (par exemple les chiffres indo-
arabes ou Devanagari) ainsi que les chiffres de pleine
largeur '\uff10' jusqu'à '\uff19'.
Modifié dans la version 3.6: Les tirets bas sont autorisés pour regrouper, tout comme
pour l'arithmétique en virgule fixe et flottante.
Il existe quelques différences mineures entre l'arithmétique entre les objets décimaux
et l'arithmétique avec les entiers et les float. Quand l'opérateur modulo % est
appliqué sur des objets décimaux, le signe du résultat est le signe du dividend plutôt
que le signe du diviseur :
>>>
>>> (-7) % 4
1
>>> Decimal(-7) % Decimal(4)
Decimal('-3')
>>>
>>> -7 // 4
-2
>>> Decimal(-7) // Decimal(4)
Decimal('-1')
In addition to the standard numeric properties, decimal floating point objects also
have a number of specialized methods:
adjusted()
Return the adjusted exponent after shifting out the coefficient's rightmost digits until
only the lead digit remains: Decimal('321e+5').adjusted() returns seven. Used
for determining the position of the most significant digit with respect to the decimal
point.
as_integer_ratio()
Return a pair (n, d) of integers that represent the given Decimal instance as a
fraction, in lowest terms and with a positive denominator:
>>>
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
as_tuple()
Return a named tuple representation of the
number: DecimalTuple(sign, digits, exponent).
canonical()
Return the canonical encoding of the argument. Currently, the encoding of
a Decimal instance is always canonical, so this operation returns its argument
unchanged.
compare(other, context=None)
Compare the values of two Decimal instances. compare() returns a Decimal
instance, and if either operand is a NaN then the result is a NaN:
compare_total(other, context=None)
Compare two operands using their abstract representation rather than their numerical
value. Similar to the compare() method, but the result gives a total ordering
on Decimal instances. Two Decimal instances with the same numeric value but
different representations compare unequal in this ordering:
>>> Decimal('12.0').compare_total(Decimal('12'))
Decimal('-1')
Quiet and signaling NaNs are also included in the total ordering. The result of this
function is Decimal('0') if both operands have the same
representation, Decimal('-1') if the first operand is lower in the total order than the
second, and Decimal('1') if the first operand is higher in the total order than the
second operand. See the specification for details of the total order.
This operation is unaffected by context and is quiet: no flags are changed and no
rounding is performed. As an exception, the C version may raise InvalidOperation if
the second operand cannot be converted exactly.
compare_total_mag(other, context=None)
Compare two operands using their abstract representation rather than their value as
in compare_total(), but ignoring the sign of each
operand. x.compare_total_mag(y) is equivalent
to x.copy_abs().compare_total(y.copy_abs()).
This operation is unaffected by context and is quiet: no flags are changed and no
rounding is performed. As an exception, the C version may raise InvalidOperation if
the second operand cannot be converted exactly.
conjugate()
Just returns self, this method is only to comply with the Decimal Specification.
copy_abs()
Return the absolute value of the argument. This operation is unaffected by the
context and is quiet: no flags are changed and no rounding is performed.
copy_negate()
Return the negation of the argument. This operation is unaffected by the context and
is quiet: no flags are changed and no rounding is performed.
copy_sign(other, context=None)
Return a copy of the first operand with the sign set to be the same as the sign of the
second operand. For example:
>>> Decimal('2.3').copy_sign(Decimal('-1.5'))
Decimal('-2.3')
This operation is unaffected by context and is quiet: no flags are changed and no
rounding is performed. As an exception, the C version may raise InvalidOperation if
the second operand cannot be converted exactly.
exp(context=None)
Return the value of the (natural) exponential function e**x at the given number. The
result is correctly rounded using the ROUND_HALF_EVEN rounding mode.
>>> Decimal(1).exp()
Decimal('2.718281828459045235360287471')
>>> Decimal(321).exp()
Decimal('2.561702493119680037517373933E+139')
from_float(f)
Classmethod that converts a float to a decimal number, exactly.
Note Decimal.from_float(0.1) is not the same as Decimal('0.1'). Since 0.1 is not
exactly representable in binary floating point, the value is stored as the nearest
representable value which is 0x1.999999999999ap-4. That equivalent value in
decimal is 0.1000000000000000055511151231257827021181583404541015625.
Note
From Python 3.2 onwards, a Decimal instance can also be constructed directly from
a float.
>>> Decimal.from_float(0.1)
Decimal('0.100000000000000005551115123125782702118158340454101562
5')
>>> Decimal.from_float(float('nan'))
Decimal('NaN')
>>> Decimal.from_float(float('inf'))
Decimal('Infinity')
>>> Decimal.from_float(float('-inf'))
Decimal('-Infinity')
fma(other, third, context=None)
Fused multiply-add. Return self*other+third with no rounding of the intermediate
product self*other.
>>> Decimal(2).fma(3, 5)
Decimal('11')
is_canonical()
Return True if the argument is canonical and False otherwise. Currently,
a Decimal instance is always canonical, so this operation always returns True.
is_finite()
Return True if the argument is a finite number, and False if the argument is an
infinity or a NaN.
is_infinite()
Return True if the argument is either positive or negative infinity
and False otherwise.
is_nan()
Return True if the argument is a (quiet or signaling) NaN and False otherwise.
is_normal(context=None)
Return True if the argument is a normal finite number. Return False if the argument
is zero, subnormal, infinite or a NaN.
is_qnan()
Return True if the argument is a quiet NaN, and False otherwise.
is_signed()
Return True if the argument has a negative sign and False otherwise. Note that
zeros and NaNs can both carry signs.
is_snan()
Return True if the argument is a signaling NaN and False otherwise.
is_subnormal(context=None)
Return True if the argument is subnormal, and False otherwise.
is_zero()
Return True if the argument is a (positive or negative) zero and False otherwise.
ln(context=None)
Return the natural (base e) logarithm of the operand. The result is correctly rounded
using the ROUND_HALF_EVEN rounding mode.
log10(context=None)
Return the base ten logarithm of the operand. The result is correctly rounded using
the ROUND_HALF_EVEN rounding mode.
logb(context=None)
For a nonzero number, return the adjusted exponent of its operand as
a Decimal instance. If the operand is a zero then Decimal('-Infinity') is
returned and the DivisionByZero flag is raised. If the operand is an infinity
then Decimal('Infinity') is returned.
logical_and(other, context=None)
logical_and() is a logical operation which takes two logical operands (see Logical
operands). The result is the digit-wise and of the two operands.
logical_invert(context=None)
logical_invert() is a logical operation. The result is the digit-wise inversion of the
operand.
logical_or(other, context=None)
logical_or() is a logical operation which takes two logical operands (see Logical
operands). The result is the digit-wise or of the two operands.
logical_xor(other, context=None)
logical_xor() is a logical operation which takes two logical operands (see Logical
operands). The result is the digit-wise exclusive or of the two operands.
max(other, context=None)
Like max(self, other) except that the context rounding rule is applied before
returning and that NaN values are either signaled or ignored (depending on the
context and whether they are signaling or quiet).
max_mag(other, context=None)
Similar to the max() method, but the comparison is done using the absolute values
of the operands.
min(other, context=None)
Like min(self, other) except that the context rounding rule is applied before
returning and that NaN values are either signaled or ignored (depending on the
context and whether they are signaling or quiet).
min_mag(other, context=None)
Similar to the min() method, but the comparison is done using the absolute values
of the operands.
next_minus(context=None)
Return the largest number representable in the given context (or in the current
thread's context if no context is given) that is smaller than the given operand.
next_plus(context=None)
Return the smallest number representable in the given context (or in the current
thread's context if no context is given) that is larger than the given operand.
next_toward(other, context=None)
If the two operands are unequal, return the number closest to the first operand in the
direction of the second operand. If both operands are numerically equal, return a
copy of the first operand with the sign set to be the same as the sign of the second
operand.
normalize(context=None)
Normalize the number by stripping the rightmost trailing zeros and converting any
result equal to Decimal('0') to Decimal('0e0'). Used for producing canonical
values for attributes of an equivalence class. For
example, Decimal('32.100') and Decimal('0.321000e+2') both normalize to
the equivalent value Decimal('32.1').
number_class(context=None)
Return a string describing the class of the operand. The returned value is one of the
following ten strings.
>>> Decimal('1.41421356').quantize(Decimal('1.000'))
Decimal('1.414')
Unlike other operations, if the length of the coefficient after the quantize operation
would be greater than precision, then an InvalidOperation is signaled. This
guarantees that, unless there is an error condition, the quantized exponent is always
equal to that of the right-hand operand.
Also unlike other operations, quantize never signals Underflow, even if the result is
subnormal and inexact.
If the exponent of the second operand is larger than that of the first then rounding
may be necessary. In this case, the rounding mode is determined by
the rounding argument if given, else by the given context argument; if neither
argument is given the rounding mode of the current thread's context is used.
radix()
Return Decimal(10), the radix (base) in which the Decimal class does all its
arithmetic. Included for compatibility with the specification.
remainder_near(other, context=None)
Return the remainder from dividing self by other. This differs from self % other in
that the sign of the remainder is chosen so as to minimize its absolute value. More
precisely, the return value is self - n * other where n is the integer nearest to
the exact value of self / other, and if two integers are equally near then the even
one is chosen.
If the result is zero then its sign will be the sign of self.
>>> Decimal(18).remainder_near(Decimal(10))
Decimal('-2')
>>> Decimal(25).remainder_near(Decimal(10))
Decimal('5')
>>> Decimal(35).remainder_near(Decimal(10))
Decimal('-5')
rotate(other, context=None)
Return the result of rotating the digits of the first operand by an amount specified by
the second operand. The second operand must be an integer in the range -precision
through precision. The absolute value of the second operand gives the number of
places to rotate. If the second operand is positive then rotation is to the left;
otherwise rotation is to the right. The coefficient of the first operand is padded on the
left with zeros to length precision if necessary. The sign and exponent of the first
operand are unchanged.
same_quantum(other, context=None)
Test whether self and other have the same exponent or whether both are NaN.
This operation is unaffected by context and is quiet: no flags are changed and no
rounding is performed. As an exception, the C version may raise InvalidOperation if
the second operand cannot be converted exactly.
scaleb(other, context=None)
Return the first operand with exponent adjusted by the second. Equivalently, return
the first operand multiplied by 10**other. The second operand must be an integer.
shift(other, context=None)
Return the result of shifting the digits of the first operand by an amount specified by
the second operand. The second operand must be an integer in the range -precision
through precision. The absolute value of the second operand gives the number of
places to shift. If the second operand is positive then the shift is to the left; otherwise
the shift is to the right. Digits shifted into the coefficient are zeros. The sign and
exponent of the first operand are unchanged.
sqrt(context=None)
Return the square root of the argument to full precision.
to_eng_string(context=None)
Convert to a string, using engineering notation if an exponent is needed.
to_integral(rounding=None, context=None)
Identical to the to_integral_value() method. The to_integral name has been
kept for compatibility with older versions.
to_integral_exact(rounding=None, context=None)
Round to the nearest integer, signaling Inexact or Rounded as appropriate if
rounding occurs. The rounding mode is determined by the rounding parameter if
given, else by the given context. If neither parameter is given then the rounding
mode of the current context is used.
to_integral_value(rounding=None, context=None)
Round to the nearest integer without signaling Inexact or Rounded. If given,
applies rounding; otherwise, uses the rounding method in either the
supplied context or the current context.
Logical operands
The logical_and(), logical_invert(), logical_or(),
and logical_xor() methods expect their arguments to be logical operands.
A logical operand is a Decimal instance whose exponent and sign are both zero,
and whose digits are all either 0 or 1.
Context objects
Contexts are environments for arithmetic operations. They govern precision, set rules
for rounding, determine which signals are treated as exceptions, and limit the range
for exponents.
Each thread has its own current context which is accessed or changed using
the getcontext() and setcontext() functions:
decimal.getcontext()
decimal.setcontext(c)
decimal.localcontext(ctx=None)
Return a context manager that will set the current context for the active thread to a
copy of ctx on entry to the with-statement and restore the previous context when
exiting the with-statement. If no context is specified, a copy of the current context is
used.
For example, the following code sets the current decimal precision to 42 places,
performs a calculation, and then automatically restores the previous context:
class decimal.BasicContext
Because many of the traps are enabled, this context is useful for debugging.
class decimal.ExtendedContext
Because the traps are disabled, this context is useful for applications that prefer to
have result value of NaN or Infinity instead of raising exceptions. This allows an
application to complete a run in the presence of conditions that would otherwise halt
the program.
class decimal.DefaultContext
In addition to the three supplied contexts, new contexts can be created with
the Context constructor.
class decimal.Context(prec=None, rounding=None, Emin=None, Emax=None, capita
ls=None, clamp=None, flags=None, traps=None)
Creates a new context. If a field is not specified or is None, the default values are
copied from the DefaultContext. If the flags field is not specified or is None, all
flags are cleared.
prec is an integer in the range [ 1, MAX_PREC] that sets the precision for arithmetic
operations in the context.
>>>
clear_flags()
Resets all of the flags to 0.
clear_traps()
Resets all of the traps to 0.
copy()
Return a duplicate of the context.
copy_decimal(num)
Return a copy of the Decimal instance num.
create_decimal(num)
Creates a new Decimal instance from num but using self as context. Unlike
the Decimal constructor, the context precision, rounding method, flags, and traps
are applied to the conversion.
This is useful because constants are often given to a greater precision than is
needed by the application. Another benefit is that rounding immediately eliminates
unintended effects from digits beyond the current precision. In the following example,
using unrounded inputs means that adding zero to a sum can change the result:
>>> getcontext().prec = 3
>>> Decimal('3.4445') + Decimal('1.0023')
Decimal('4.45')
>>> Decimal('3.4445') + Decimal(0) + Decimal('1.0023')
Decimal('4.44')
This method implements the to-number operation of the IBM specification. If the
argument is a string, no leading or trailing whitespace or underscores are permitted.
create_decimal_from_float(f)
Creates a new Decimal instance from a float f but rounding using self as the context.
Unlike the Decimal.from_float() class method, the context precision, rounding
method, flags, and traps are applied to the conversion.
Etiny()
Returns a value equal to Emin - prec + 1 which is the minimum exponent value
for subnormal results. When underflow occurs, the exponent is set to Etiny.
Etop()
Returns a value equal to Emax - prec + 1.
abs(x)
Renvoie la valeur absolue de x.
add(x, y)
Return the sum of x and y.
canonical(x)
Returns the same Decimal object x.
compare(x, y)
Compares x and y numerically.
compare_signal(x, y)
Compares the values of the two operands numerically.
compare_total(x, y)
Compares two operands using their abstract representation.
compare_total_mag(x, y)
Compares two operands using their abstract representation, ignoring sign.
copy_abs(x)
Returns a copy of x with the sign set to 0.
copy_negate(x)
Returns a copy of x with the sign inverted.
copy_sign(x, y)
Copies the sign from y to x.
divide(x, y)
Return x divided by y.
divide_int(x, y)
Return x divided by y, truncated to an integer.
divmod(x, y)
Divides two numbers and returns the integer part of the result.
exp(x)
Returns e ** x.
fma(x, y, z)
Returns x multiplied by y, plus z.
is_canonical(x)
Returns True if x is canonical; otherwise returns False.
is_finite(x)
Returns True if x is finite; otherwise returns False.
is_infinite(x)
Returns True if x is infinite; otherwise returns False.
is_nan(x)
Returns True if x is a qNaN or sNaN; otherwise returns False.
is_normal(x)
Returns True if x is a normal number; otherwise returns False.
is_qnan(x)
Returns True if x is a quiet NaN; otherwise returns False.
is_signed(x)
Returns True if x is negative; otherwise returns False.
is_snan(x)
Returns True if x is a signaling NaN; otherwise returns False.
is_subnormal(x)
Returns True if x is subnormal; otherwise returns False.
is_zero(x)
Returns True if x is a zero; otherwise returns False.
ln(x)
Returns the natural (base e) logarithm of x.
log10(x)
Returns the base 10 logarithm of x.
logb(x)
Returns the exponent of the magnitude of the operand's MSD.
logical_and(x, y)
Applies the logical operation and between each operand's digits.
logical_invert(x)
Invert all the digits in x.
logical_or(x, y)
Applies the logical operation or between each operand's digits.
logical_xor(x, y)
Applies the logical operation xor between each operand's digits.
max(x, y)
Compares two values numerically and returns the maximum.
max_mag(x, y)
Compares the values numerically with their sign ignored.
min(x, y)
Compares two values numerically and returns the minimum.
min_mag(x, y)
Compares the values numerically with their sign ignored.
minus(x)
Minus corresponds to the unary prefix minus operator in Python.
multiply(x, y)
Return the product of x and y.
next_minus(x)
Returns the largest representable number smaller than x.
next_plus(x)
Returns the smallest representable number larger than x.
next_toward(x, y)
Returns the number closest to x, in direction towards y.
normalize(x)
Reduces x to its simplest form.
number_class(x)
Returns an indication of the class of x.
plus(x)
Plus corresponds to the unary prefix plus operator in Python. This operation applies
the context precision and rounding, so it is not an identity operation.
power(x, y, modulo=None)
Return x to the power of y, reduced modulo modulo if given.
quantize(x, y)
Returns a value equal to x (rounded), having the exponent of y.
radix()
Just returns 10, as this is Decimal, :)
remainder(x, y)
Returns the remainder from integer division.
The sign of the result, if non-zero, is the same as that of the original dividend.
remainder_near(x, y)
Returns x - y * n, where n is the integer nearest the exact value of x / y (if the
result is 0 then its sign will be the sign of x).
rotate(x, y)
Returns a rotated copy of x, y times.
same_quantum(x, y)
Returns True if the two operands have the same exponent.
scaleb(x, y)
Returns the first operand after adding the second value its exp.
shift(x, y)
Returns a shifted copy of x, y times.
sqrt(x)
Square root of a non-negative number to context precision.
subtract(x, y)
Return the difference between x and y.
to_eng_string(x)
Convert to a string, using engineering notation if an exponent is needed.
to_integral_exact(x)
Rounds to an integer.
to_sci_string(x)
Converts a number to a string using scientific notation.
Constantes
The constants in this section are only relevant for the C module. They are also
included in the pure Python version for compatibility.
32-bit 64-bit
decimal.MAX_ 425000 9999999999999
PREC 000 99999
decimal.MIN_ - -
EMIN 425000 9999999999999
000 99999
decimal.MIN_ - -
ETINY 849999 1999999999999
999 999997
decimal.HAVE_THREADS
The value is True. Deprecated, because Python now always has threads.
decimal.HAVE_CONTEXTVAR
Rounding modes
decimal.ROUND_CEILING
Round towards Infinity.
decimal.ROUND_DOWN
Round towards zero.
decimal.ROUND_FLOOR
Round towards -Infinity.
decimal.ROUND_HALF_DOWN
decimal.ROUND_HALF_EVEN
decimal.ROUND_HALF_UP
decimal.ROUND_UP
decimal.ROUND_05UP
Round away from zero if last digit after rounding towards zero would have been 0 or
5; otherwise round towards zero.
Signals
Signals represent conditions that arise during computation. Each corresponds to one
context flag and one context trap enabler.
The context flag is set whenever the condition is encountered. After the computation,
flags may be checked for informational purposes (for instance, to determine whether
a computation was exact). After checking the flags, be sure to clear all flags before
starting the next computation.
If the context's trap enabler is set for the signal, then the condition causes a Python
exception to be raised. For example, if the DivisionByZero trap is set, then
a DivisionByZero exception is raised upon encountering the condition.
class decimal.Clamped
class decimal.DecimalException
class decimal.DivisionByZero
Can occur with division, modulo division, or when raising a number to a negative
power. If this signal is not trapped, returns Infinity or -Infinity with the sign
determined by the inputs to the calculation.
class decimal.Inexact
Signals when non-zero digits were discarded during rounding. The rounded result is
returned. The signal flag or trap is used to detect when results are inexact.
class decimal.InvalidOperation
Indicates that an operation was requested that does not make sense. If not trapped,
returns NaN. Possible causes include:
Infinity - Infinity
0 * Infinity
Infinity / Infinity
x % 0
Infinity % x
sqrt(-x) and x > 0
0 ** 0
x ** (non-integer)
x ** Infinity
class decimal.Overflow
Numerical overflow.
class decimal.Rounded
Signaled whenever rounding discards digits; even if those digits are zero (such as
rounding 5.00 to 5.0). If not trapped, returns the result unchanged. This signal is
used to detect loss of significant digits.
class decimal.Subnormal
Occurs when an operation result is subnormal (the exponent is too small). If not
trapped, returns the result unchanged.
class decimal.Underflow
class decimal.FloatOperation
If the signal is not trapped (default), mixing floats and Decimals is permitted in
the Decimal constructor, create_decimal() and all comparison operators. Both
conversion and comparisons are exact. Any occurrence of a mixed operation is
silently recorded by setting FloatOperation in the context flags. Explicit
conversions with from_float() or create_decimal_from_float() do not set
the flag.
Otherwise (the signal is trapped), only equality comparisons and explicit conversions
are silent. All other mixed operations raise FloatOperation.
exceptions.ArithmeticError(exceptions.Exception)
DecimalException
Clamped
DivisionByZero(DecimalException,
exceptions.ZeroDivisionError)
Inexact
Overflow(Inexact, Rounded)
Underflow(Inexact, Rounded, Subnormal)
InvalidOperation
Rounded
Subnormal
FloatOperation(DecimalException, exceptions.TypeError)
The effects of round-off error can be amplified by the addition or subtraction of nearly
offsetting quantities resulting in loss of significance. Knuth provides two instructive
examples where rounded floating point arithmetic with insufficient precision causes
the breakdown of the associative and distributive properties of addition:
>>> getcontext().prec = 20
>>> u, v, w = Decimal(11111113), Decimal(-11111111),
Decimal('7.51111111')
>>> (u + v) + w
Decimal('9.51111111')
>>> u + (v + w)
Decimal('9.51111111')
>>>
>>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
>>> (u*v) + (u*w)
Decimal('0.0060000')
>>> u * (v+w)
Decimal('0.0060000')
Special values
The number system for the decimal module provides special values
including NaN, sNaN, -Infinity, Infinity, and two zeros, +0 and -0.
The infinities are signed (affine) and can be used in arithmetic operations where they
get treated as very large, indeterminate numbers. For instance, adding a constant to
infinity gives another infinite result.
A variant is sNaN which signals rather than remaining quiet after every operation.
This is a useful return value when an invalid result needs to interrupt a calculation for
special handling.
The signed zeros can result from calculations that underflow. They keep the sign that
would have resulted if the calculation had been carried out to greater precision. Since
their magnitude is zero, both positive and negative zeros are treated as equal and
their sign is informational.
In addition to the two signed zeros which are distinct yet equal, there are various
representations of zero with differing precisions yet equivalent in value. This takes a
bit of getting used to. For an eye accustomed to normalized floating point
representations, it is not immediately obvious that the following calculation returns a
value equal to zero:
>>> 1 / Decimal('Infinity')
Decimal('0E-1000026')
Cas pratiques
Here are a few recipes that serve as utility functions and that demonstrate ways to
work with the Decimal class:
>>> d = Decimal('-1234567.8901')
>>> moneyfmt(d, curr='$')
'-$1,234,567.89'
>>> moneyfmt(d, places=0, sep='.', dp='', neg='',
trailneg='-')
'1.234.568-'
>>> moneyfmt(d, curr='$', neg='(', trailneg=')')
'($1,234,567.89)'
>>> moneyfmt(Decimal(123456789), sep=' ')
'123 456 789.00'
>>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
'<0.02>'
"""
q = Decimal(10) ** -places # 2 places --> '0.01'
sign, digits, exp = value.quantize(q).as_tuple()
result = []
digits = list(map(str, digits))
build, next = result.append, digits.pop
if sign:
build(trailneg)
for i in range(places):
build(next() if digits else '0')
if places:
build(dp)
if not digits:
build('0')
i = 0
while digits:
build(next())
i += 1
if i == 3 and digits:
i = 0
build(sep)
build(curr)
build(neg if sign else pos)
return ''.join(reversed(result))
def pi():
"""Compute Pi to the current precision.
>>> print(pi())
3.141592653589793238462643383
"""
getcontext().prec += 2 # extra digits for intermediate steps
three = Decimal(3) # substitute "three=3.0" for regular
floats
lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
while s != lasts:
lasts = s
n, na = n+na, na+8
d, da = d+da, da+32
t = (t * n) / d
s += t
getcontext().prec -= 2
return +s # unary plus applies the new
precision
def exp(x):
"""Return e raised to the power of x. Result type matches
input type.
>>> print(exp(Decimal(1)))
2.718281828459045235360287471
>>> print(exp(Decimal(2)))
7.389056098930650227230427461
>>> print(exp(2.0))
7.38905609893
>>> print(exp(2+0j))
(7.38905609893+0j)
"""
getcontext().prec += 2
i, lasts, s, fact, num = 0, 0, 1, 1, 1
while s != lasts:
lasts = s
i += 1
fact *= i
num *= x
s += num / fact
getcontext().prec -= 2
return +s
def cos(x):
"""Return the cosine of x as measured in radians.
>>> print(cos(Decimal('0.5')))
0.8775825618903727161162815826
>>> print(cos(0.5))
0.87758256189
>>> print(cos(0.5+0j))
(0.87758256189+0j)
"""
getcontext().prec += 2
i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1
while s != lasts:
lasts = s
i += 2
fact *= i * (i-1)
num *= x * x
sign *= -1
s += num / fact * sign
getcontext().prec -= 2
return +s
def sin(x):
"""Return the sine of x as measured in radians.
>>> print(sin(Decimal('0.5')))
0.4794255386042030002732879352
>>> print(sin(0.5))
0.479425538604
>>> print(sin(0.5+0j))
(0.479425538604+0j)
"""
getcontext().prec += 2
i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1
while s != lasts:
lasts = s
i += 2
fact *= i * (i-1)
num *= x * x
sign *= -1
s += num / fact * sign
getcontext().prec -= 2
return +s
FAQ decimal
Q. C'est fastidieux de taper decimal.Decimal('1234.5'). Y a-t-il un moyen de
réduire la frappe quand on utilise l'interpréteur interactif ?
>>> D = decimal.Decimal
>>> D('1.23') + D('3.45')
Decimal('4.68')
Q. In a fixed-point application with two decimal places, some inputs have many
places and need to be rounded. Others are not supposed to have excess digits and
need to be validated. What methods should be used?
Q. Once I have valid two place inputs, how do I maintain that invariant throughout an
application?
Q. Some decimal values always print with exponential notation. Is there a way to get
a non-exponential representation?
A. For some values, exponential notation is the only way to express the number of
significant places in the coefficient. For example, expressing 5.0E+3 as 5000 keeps
the value constant but cannot show the original's two-place significance.
If an application does not care about tracking significance, it is easy to remove the
exponent and trailing zeroes, losing significance, but keeping the value unchanged:
A. Yes, any binary floating point number can be exactly expressed as a Decimal
though an exact conversion may take more precision than intuition would suggest:
>>> Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
Q. Within a complex calculation, how can I make sure that I haven't gotten a spurious
result because of insufficient precision or rounding anomalies.
A. The decimal module makes it easy to test results. A best practice is to re-run
calculations using greater precision and with various rounding modes. Widely
differing results indicate insufficient precision, rounding mode issues, ill-conditioned
inputs, or a numerically unstable algorithm.
Q. I noticed that context precision is applied to the results of operations but not to the
inputs. Is there anything to watch out for when mixing values of different precisions?
A. Yes. The principle is that all values are considered to be exact and so is the
arithmetic on those values. Only the results are rounded. The advantage for inputs is
that "what you type is what you get". A disadvantage is that the results can look odd if
you forget that the inputs haven't been rounded:
>>> getcontext().prec = 3
>>> Decimal('3.104') + Decimal('2.104')
Decimal('5.21')
>>> Decimal('3.104') + Decimal('0.000') + Decimal('2.104')
Decimal('5.20')
The solution is either to increase precision or to force rounding of inputs using the
unary plus operation:
>>> getcontext().prec = 3
>>> +Decimal('1.23456789') # unary plus triggers rounding
Decimal('1.23')
>>> Context(prec=5,
rounding=ROUND_DOWN).create_decimal('1.2345678')
Decimal('1.2345')
A. Yes. In the CPython and PyPy3 implementations, the C/CFFI versions of the
decimal module integrate the high speed libmpdec library for arbitrary precision
correctly-rounded decimal floating point arithmetic. libmpdec uses Karatsuba
multiplication for medium-sized numbers and the Number Theoretic Transform for
very large numbers. However, to realize this performance gain, the context needs to
be set for unrounded calculations.
>>> c = getcontext()
>>> c.prec = MAX_PREC
>>> c.Emax = MAX_EMAX
>>> c.Emin = MIN_EMIN
Une instance de Fraction peut être construite depuis une paire d'entiers, depuis un
autre nombre rationnel, ou depuis une chaîne de caractères.
class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(other_fraction)
class fractions.Fraction(float)
class fractions.Fraction(decimal)
class fractions.Fraction(string)
>>>
numerator
Numérateur de la fraction irréductible.
denominator
Dénominateur de la fraction irréductible.
from_float(flt)
Cette méthode de classe construit un objet Fraction représentant la valeur exacte
de flt, qui doit être de type float. Attention, Fraction.from_float(0.3) n'est pas
la même valeur que Fraction(3, 10).
Note
Note
__round__()
__round__(ndigits)
La première version renvoie l' int le plus proche de self, arrondissant les demis au
nombre pair le plus proche. La seconde version arrondit self au plus proche
multiple de Fraction(1, 10**ndigits) (logiquement, si ndigits est négatif),
arrondissant toujours les demis au nombre pair le plus proche. Cette méthode peut
aussi être utilisée à via la fonction round().
fractions.gcd(a, b)
Voir aussi
Module numbers
Pour l'ensemble des réels, il y a des fonctions pour calculer des distributions
uniformes, normales (gaussiennes), log-normales, exponentielles négatives, gamma
et bêta. Pour générer des distributions d'angles, la distribution de von Mises est
disponible.
Avertissement
Si a est omis ou None, l'heure système actuelle est utilisée. Si des sources aléatoires
sont fournies par le système d'exploitation, elles sont utilisées à la place de l'heure
système (voir la fonction os.urandom() pour les détails sur la disponibilité).
Avec la version 1 (fournie pour reproduire des séquences aléatoires produites par
d'anciennes versions de Python), l'algorithme pour str et bytes génère une gamme
plus étroite de graines.
Modifié dans la version 3.2: Passée à la version 2 du schéma qui utilise tous les bits
d'une graine de chaîne de caractères.
random.getstate()
Renvoie un objet capturant l'état interne actuel du générateur. Cet objet peut être
passé à setstate() pour restaurer cet état.
random.setstate(state)
random.getrandbits(k)
Renvoie un entier Python avec k bits aléatoires. Cette méthode est fournie avec le
générateur MersenneTwister. Quelques autres générateurs peuvent également la
fournir en option comme partie de l'API. Lorsqu'elle est
disponible, getrandbits() permet à randrange() de gérer des gammes
arbitrairement larges.
random.randrange(start, stop[, step])
random.randint(a, b)
random.choices(population, weights=None, *, cum_weights=None, k=1)
Si une séquence de poids est spécifiée, les tirages sont effectués en fonction des
poids relatifs. Alternativement, si une séquence cum_weights est donnée, les tirages
sont faits en fonction des poids cumulés (peut-être calculés en
utilisant itertools.accumulate()). Par exemple, les poids
relatifs [10, 5, 30, 5] sont équivalents aux poids
cumulatifs [10, 15, 45, 50]. En interne, les poids relatifs sont convertis en poids
cumulatifs avant d'effectuer les tirages, ce qui vous permet d'économiser du travail
en fournissant des pondérations cumulatives.
random.shuffle(x[, random])
Pour mélanger une séquence immuable et renvoyer une nouvelle liste mélangée,
utilisez sample(x, k=len(x)) à la place.
Notez que même pour les petits len(x), le nombre total de permutations de x peut
rapidement devenir plus grand que la période de la plupart des générateurs de
nombres aléatoires. Cela implique que la plupart des permutations d'une longue
séquence ne peuvent jamais être générées. Par exemple, une séquence de longueur
2080 est la plus grande qui puisse tenir dans la période du générateur de nombres
aléatoires Mersenne Twister.
random.sample(population, k)
random.random()
Renvoie le nombre aléatoire à virgule flottante suivant dans la plage [0.0, 1.0).
random.uniform(a, b)
La valeur finale b peut ou non être incluse dans la plage selon l'arrondi à virgule
flottante dans l'équation a + (b-a) * random().
random.triangular(low, high, mode)
random.expovariate(lambd)
random.gammavariate(alpha, beta)
Distribution gamma. (Ce n'est pas la fonction gamma !) Les conditions sur les
paramètres sont alpha > 0 et beta > 0.
random.lognormvariate(mu, sigma)
random.normalvariate(mu, sigma)
random.vonmisesvariate(mu, kappa)
random.paretovariate(alpha)
Générateur alternatif
class random.Random([seed])
class random.SystemRandom([seed])
>>>
>>> random() # Random float: 0.0 <=
x < 1.0
0.37444887175646646
>>> sample([10, 20, 30, 40, 50], k=4) # Four samples without
replacement
[40, 10, 50, 30]
Simulations :
>>>
# http://statistics.about.com/od/Applications/a/Example-Of-
Bootstrapping.htm
from statistics import mean
from random import choices
data = 1, 2, 4, 4, 10
means = sorted(mean(choices(data, k=5)) for i in range(20))
print(f'The sample mean of {mean(data):.1f} has a 90% confidence
'
f'interval from {means[1]:.1f} to {means[-2]:.1f}')
drug = [54, 73, 53, 70, 73, 68, 52, 65, 65]
placebo = [54, 51, 58, 44, 55, 52, 42, 47, 58, 46]
observed_diff = mean(drug) - mean(placebo)
n = 10000
count = 0
combined = drug + placebo
for i in range(n):
shuffle(combined)
new_diff = mean(combined[:len(drug)]) -
mean(combined[len(drug):])
count += (new_diff >= observed_diff)
Simulation des heures d'arrivée et des livraisons de services dans une seule file
d'attente de serveurs :
average_arrival_interval = 5.6
average_service_time = 5.0
stdev_service_time = 0.5
num_waiting = 0
arrivals = []
starts = []
arrival = service_end = 0.0
for i in range(20000):
if arrival <= service_end:
num_waiting += 1
arrival += expovariate(1.0 / average_arrival_interval)
arrivals.append(arrival)
else:
num_waiting -= 1
service_start = service_end if num_waiting else arrival
service_time = gauss(average_service_time,
stdev_service_time)
service_end = service_start + service_time
starts.append(service_start)
waits = [start - arrival for arrival, start in zip(arrivals,
starts)]
print(f'Mean wait: {mean(waits):.1f}. Stdev wait:
{stdev(waits):.1f}.')
print(f'Median wait: {median(waits):.1f}. Max wait:
{max(waits):.1f}.')
Voir aussi
Note
Mesures de la dispersion
Ces fonctions mesurent la tendance de la population ou d'un échantillon à dévier des
valeurs typiques ou des valeurs moyennes.
statistics.mean(data)
The mean is strongly affected by outliers and is not a robust estimator for central
location: the mean is not necessarily a typical example of the data points. For more
robust, although less efficient, measures of central location,
see median() and mode(). (In this case, "efficient" refers to statistical efficiency
rather than computational efficiency.)
The sample mean gives an unbiased estimate of the true population mean, which
means that, taken on average over all the possible
samples, mean(sample) converges on the true mean of the entire population.
If data represents the entire population rather than a sample, then mean(data) is
equivalent to calculating the true population mean μ.
statistics.harmonic_mean(data)
The harmonic mean, sometimes called the subcontrary mean, is the reciprocal of the
arithmetic mean() of the reciprocals of the data. For example, the harmonic mean of
three values a, b and c will be equivalent to 3/(1/a + 1/b + 1/c).
The harmonic mean is a type of average, a measure of the central location of the
data. It is often appropriate when averaging quantities which are rates or ratios, for
example speeds. For example:
Using the arithmetic mean would give an average of about 5.167, which is too high.
statistics.median(data)
Return the median (middle value) of numeric data, using the common "mean of
middle two" method. If data is empty, StatisticsError is raised. data can be a
sequence or iterator.
The median is a robust measure of central location, and is less affected by the
presence of outliers in your data. When the number of data points is odd, the middle
data point is returned:
Cette approche est adaptée à des données discrètes à condition que vous acceptiez
que la médiane ne fasse pas nécessairement partie des observations.
If your data is ordinal (supports order operations) but not numeric (doesn't support
addition), you should use median_low() or median_high() instead.
Voir aussi
median_low(), median_high(), median_grouped()
statistics.median_low(data)
Return the low median of numeric data. If data is empty, StatisticsError is
raised. data can be a sequence or iterator.
La médiane basse est toujours une valeur représentée dans les données. Lorsque le
nombre d'observations est impair, la valeur du milieu est renvoyée. Sinon, la plus
petite des deux valeurs du milieu est renvoyée.
Utilisez la médiane basse lorsque vos données sont discrètes et que vous préférez
que la médiane soit une valeur représentée dans vos observations plutôt que le
résultat d'une interpolation.
statistics.median_high(data)
La médiane haute est toujours une valeur représentée dans les données. Lorsque le
nombre d'observations est impair, la valeur du milieu est renvoyée. Sinon, la plus
grande des deux valeurs du milieu est renvoyée.
Utilisez la médiane haute lorsque vos données sont discrètes et que vous préférez
que la médiane soit une valeur représentée dans vos observations plutôt que le
résultat d'une interpolation.
statistics.median_grouped(data, interval=1)
Return the median of grouped continuous data, calculated as the 50th percentile,
using interpolation. If data is empty, StatisticsError is raised. data can be a
sequence or iterator.
Cette fonction ne vérifie pas que les valeurs sont bien séparées d'au moins une
fois interval.
Return the most common data point from discrete or nominal data. The mode (when
it exists) is the most typical value, and is a robust measure of central location.
mode assumes discrete data, and returns a single value. This is the standard
treatment of the mode as commonly taught in schools:
Utilisez cette fonction pour calculer la variance sur une population complète. Pour
estimer la variance à partir d'un échantillon, utilisez plutôt variance() à la place.
Exemples :
>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]
>>> pvariance(data)
1.25
>>> mu = mean(data)
>>> pvariance(data, mu)
1.25
This function does not attempt to verify that you have passed the actual mean as mu.
Using arbitrary values for mu may lead to invalid or impossible results.
La fonction gère les nombres décimaux et les fractions :
If you somehow know the true population mean μ, you may use this function to
calculate the variance of a sample, giving the known population mean as the second
argument. Provided the data points are representative (e.g. independent and
identically distributed), the result will be an unbiased estimate of the population
variance.
statistics.stdev(data, xbar=None)
Exemples :
>>> m = mean(data)
>>> variance(data, m)
1.3720238095238095
Exceptions
Une seule exception est définie :
exception statistics.StatisticsError
Ces outils et leurs équivalents natifs fonctionnent également bien avec les fonctions
optimisées du module operator. Par exemple, l'opérateur de multiplication peut être
appliqué à deux vecteurs pour créer un produit scalaire
efficace : sum(map(operator.mul, vecteur1, vecteur2)).
Itérateurs infinis :
Argum
Itérateur Résultats Exemple
ents
chain.from_iterable(['AB
chain.from_it p0, p1, ... plast,
itérable C', 'DEF']) --> A B C D
erable() q0, q1, ...
E F
data,
(d[0] if s[0]), (d[1] compress('ABCDEF', [1,0,
compress() selecto
if s[1]), ... 1,0,1,1]) --> A C E F
rs
dropwhile() pred, seq[n], seq[n+1 dropwhile(lambda x: x<5,
seq ], commençant [1,4,6,4,1]) --> 6 4 1
Argum
Itérateur Résultats Exemple
ents
quand pred échou
e
éléments
filterfalse(lambda x: x
pred, de seq pour
filterfalse() %2, range(10)) --> 0 2 4
seq lesquels pred(ele
6 8
m) est faux
sous-itérateurs
iterable
groupby() groupés par la
[, key]
valeur de key(v)
seq,
éléments
[start,] islice('ABCDEFG', 2, Non
islice() de seq[start:s
stop [, e) --> C D E F G
top:step]
step]
starmap(pow, [(2,5), (3,
func, func(*seq[0]),
starmap() 2), (10,3)]) --> 32 9 10
seq func(*seq[1]), ...
00
seq[0], seq[1],
pred, takewhile(lambda x: x<5,
takewhile() jusqu'à ce
seq [1,4,6,4,1]) --> 1 4
que pred échoue
it1, it2, ... itn sépar
tee() it, n
e un itérateur en n
zip_longest('ABCD', 'xy'
(p[0], q[0]), (p[1],
zip_longest() p, q, ... , fillvalue='-') --> Ax
q[1]), ...
By C- D-
Itérateurs combinatoires :
Argum
Itérateur Résultats
ents
p, q, ...
produit cartésien, équivalent à une
product() [repeat
boucle for imbriquée
=1]
permutations() p[, r] n-uplets de longueur r, tous les ré-
arrangements possibles, sans
Argum
Itérateur Résultats
ents
répétition d'éléments
AB AC AD BA BC BD CA CB CD DA
permutations('ABCD', 2)
DB DC
combinations('ABCD', 2) AB AC AD BC BD CD
combinations_with_replace
AA AB AC AD BB BC BD CC CD DD
ment('ABCD', 2)
Fonctions d'itertool
Toutes les fonctions du module qui suivent construisent et renvoient des itérateurs.
Certaines produisent des flux de longueur infinie ; celles-ci ne doivent donc être
contrôlées que par des fonctions ou boucles qui interrompent le flux.
itertools.accumulate(iterable[, func])
Créer un itérateur qui renvoie les sommes accumulées, ou les résultats accumulés
d'autres fonctions binaires (spécifiées par l'argument optionnel func). Si func est
renseigné, il doit être une fonction à deux arguments. Les éléments de l'itérable
d'entrée peuvent être de n'importe quel type qui peuvent être acceptés comme
arguments de func. (Par exemple, avec l'opération par défaut d'addition, les
éléments peuvent être de n'importe quel type additionnable
incluant Decimal ou Fraction.) Si l'itérable d'entrée est vide, l'itérable de sortie
sera aussi vide.
>>>
itertools.chain(*iterables)
Crée un itérateur qui renvoie les éléments du premier itérable jusqu'à son
épuisement, puis continue avec l'itérable suivant jusqu'à ce que tous les itérables
soient épuisés. Utilisée pour traiter des séquences consécutives comme une seule
séquence. À peu près équivalent à :
def chain(*iterables):
# chain('ABC', 'DEF') --> A B C D E F
for it in iterables:
for element in it:
yield element
classmethod chain.from_iterable(iterable)
def from_iterable(iterables):
# chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
for it in iterables:
for element in it:
yield element
itertools.combinations(iterable, r)
Les éléments sont considérés comme uniques en fonction de leur position, et non
pas de leur valeur. Ainsi, si les éléments en entrée sont uniques, il n'y aura pas de
valeurs répétées dans chaque combinaison.
itertools.combinations_with_replacement(iterable, r)
Les éléments sont considérés comme uniques en fonction de leur position, et non
pas de leur valeur. Ainsi si les éléments d'entrée sont uniques, les combinaisons
générées seront aussi uniques.
À peu près équivalent à :
itertools.compress(data, selectors)
Crée un itérateur qui filtre les éléments de data, en ne renvoyant que ceux dont
l'élément correspondant dans selectors s'évalue à True. S'arrête quand
l'itérable data ou selectors a été épuisé. À peu près équivalent à :
Pour compter avec des nombres à virgule flottante, il est parfois préférable d'utiliser
le code : (start + step * i for i in count()) pour obtenir une meilleure
précision.
itertools.cycle(iterable)
def cycle(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
Note, cette fonction peut avoir besoin d'un stockage auxiliaire important (en fonction
de la longueur de l'itérable).
itertools.dropwhile(predicate, iterable)
Crée un itérateur qui saute les éléments de l'itérable tant que le prédicat est vrai ;
renvoie ensuite chaque élément. Notez que l'itérateur ne produit aucune sortie avant
que le prédicat ne devienne faux, il peut donc avoir un temps de démarrage long. À
peu près équivalent à :
Crée un itérateur qui filtre les éléments de iterable, ne renvoyant seulement ceux
pour lesquels le prédicat est False. Si predicate vaut None, renvoie les éléments qui
sont faux. À peu près équivalent à :
class groupby:
# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC
D
def __init__(self, iterable, key=None):
if key is None:
key = lambda x: x
self.keyfunc = key
self.it = iter(iterable)
self.tgtkey = self.currkey = self.currvalue = object()
def __iter__(self):
return self
def __next__(self):
self.id = object()
while self.currkey == self.tgtkey:
self.currvalue = next(self.it) # Exit on
StopIteration
self.currkey = self.keyfunc(self.currvalue)
self.tgtkey = self.currkey
return (self.currkey, self._grouper(self.tgtkey,
self.id))
def _grouper(self, tgtkey, id):
while self.id is id and self.currkey == tgtkey:
yield self.currvalue
try:
self.currvalue = next(self.it)
except StopIteration:
return
self.currkey = self.keyfunc(self.currvalue)
itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
itertools.permutations(iterable, r=None)
itertools.product(*iterables, repeat=1)
Produit cartésien des itérables d'entrée.
Cette fonction est à peu près équivalente au code suivant, à la différence près que la
vraie implémentation ne crée pas de résultats intermédiaires en mémoire :
>>>
Crée un itérateur qui exécute la fonction avec les arguments obtenus depuis
l'itérable. Utilisée à la place de map() quand les arguments sont déjà groupés en n-
uplets depuis un seul itérable — la donnée a déjà été « pré-zippée ». La différence
entre map() et starmap() est similaire à la différence
entre fonction(a,b) et fonction(*c). À peu près équivalent à :
Crée un itérateur qui renvoie les éléments d'un itérable tant que le prédicat est vrai. À
peu près équivalent à :
Le code Python qui suit aide à expliquer ce que fait tee, bien que la vraie
implémentation soit plus complexe et n'utilise qu'une file FIFO.
Une fois que tee() a créé un branchement, l'itérable iterable ne doit être utilisé nulle
part ailleurs ; sinon, iterable pourrait être avancé sans que les objets tee ne soient
informés.
Cet outil peut avoir besoin d'un stockage auxiliaire important (en fonction de la taille
des données temporaires nécessaires). En général, si un itérateur utilise la majorité
ou toute la donnée avant qu'un autre itérateur ne commence, il est plus rapide
d'utiliser list() à la place de tee().
itertools.zip_longest(*iterables, fillvalue=None)
Crée un itérateur qui agrège les éléments de chacun des itérables. Si les itérables
sont de longueurs différentes, les valeurs manquantes sont remplacées par fillvalue.
L'itération continue jusqu'à ce que l'itérable le plus long soit épuisé. À peu près
équivalent à :
Recettes itertools
Cette section présente des recettes pour créer une vaste boîte à outils en se servant
des itertools existants comme des briques.
Ces outils dérivés offrent la même bonne performance que les outils sous-jacents. La
performance mémoire supérieure est gardée en traitant les éléments un à la fois
plutôt que de charger tout l'itérable en mémoire en même temps. Le volume de code
reste bas grâce à un chaînage de style fonctionnel qui aide à éliminer les variables
temporaires. La grande vitesse est gardée en préférant les briques « vectorisées »
plutôt que les boucles for et les générateurs qui engendrent un surcoût de traitement.
def all_equal(iterable):
"Returns True if all the elements are equal to each other"
g = groupby(iterable)
return next(g, True) and not next(g, False)
def padnone(iterable):
"""Returns the sequence elements and then returns None
indefinitely.
def flatten(listOfLists):
"Flatten one level of nesting"
return chain.from_iterable(listOfLists)
Example: repeatfunc(random.random)
"""
if times is None:
return starmap(func, repeat(args))
return starmap(func, repeat(args, times))
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
num_active = len(iterables)
nexts = cycle(iter(it).__next__ for it in iterables)
while num_active:
try:
for next in nexts:
yield next()
except StopIteration:
# Remove the iterator we just exhausted from the
cycle.
num_active -= 1
nexts = cycle(islice(nexts, num_active))
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3)
(1,2,3)"
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in
range(len(s)+1))
Examples:
iter_except(functools.partial(heappop, h), IndexError)
# priority queue iterator
iter_except(d.popitem, KeyError)
# non-blocking dict iterator
iter_except(d.popleft, IndexError)
# non-blocking deque iterator
iter_except(q.get_nowait, Queue.Empty)
# loop over a producer Queue
iter_except(s.pop, KeyError)
# non-blocking set iterator
"""
try:
if first is not None:
yield first() # For database APIs needing
an initial cast to db.first()
while True:
yield func()
except exception:
pass
"""
# first_true([a,b,c], x) --> a or b or c or x
# first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
return next(filter(pred, iterable), default)
Note, beaucoup des recettes ci-dessus peuvent être optimisées en replaçant les
recherches globales par des recherches locales avec des variables locales définies
comme des valeurs par défaut. Par exemple, la recette dotproduct peut être écrite
comme :
functools.cmp_to_key(func)
Exemple :
@functools.lru_cache(maxsize=128, typed=False)
Décorateur qui englobe une fonction avec un appelable mémoïsant qui enregistre
jusqu'à maxsize appels récents. Cela peut gagner du temps quand une fonction
coûteuse en ressources est souvent appelée avec les mêmes arguments.
Comme un dictionnaire est utilisé pour mettre en cache les résultats, les arguments
positionnels et nommés de la fonction doivent être hachables.
Des agencements différents des arguments peuvent être considérés comme des
appels différents avec chacun leur propre entrée dans le cache. Par exemple, f(a=1,
b=2) et f(b=2, a=1) n'ont pas leurs arguments dans le même ordre, ce qui peut
conduire à des entrées séparées dans le cache.
Si typed est vrai, les arguments de différents types seront mis en cache séparément.
Par exemple, f(3) et f(3.0) seront considérés comme des appels distincts avec
des résultats distincts.
Un cache LRU (*least recently used*) fonctionne très bien lorsque les appels récents
sont les prochains appels les plus probables (par exemple, les articles les plus lus
d'un serveur d'actualités ont tendance à ne changer que d'un jour à l'autre). La taille
limite du cache permet de s'assurer que le cache ne grossisse pas sans limite sur les
processus longs comme les serveurs web.
En général, le cache LRU ne doit être utilisé que quand vous voulez ré-utiliser les
valeurs déjà calculées. Ainsi, cela n'a pas de sens de mettre un cache sur une
fonction qui a des effets de bord, qui doit créer un objet mutable distinct à chaque
appel ou des fonctions impures telles que !time() ou !random().
@lru_cache(maxsize=32)
def get_pep(num):
'Retrieve text of a Python Enhancement Proposal'
resource = 'http://www.python.org/dev/peps/pep-%04d/' % num
try:
with urllib.request.urlopen(resource) as s:
return s.read()
except urllib.error.HTTPError:
return 'Not Found'
>>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:
... pep = get_pep(n)
... print(n, len(pep))
>>> get_pep.cache_info()
CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)
@functools.total_ordering
Par exemple :
@total_ordering
class Student:
def _is_valid_operand(self, other):
return (hasattr(other, "lastname") and
hasattr(other, "firstname"))
def __eq__(self, other):
if not self._is_valid_operand(other):
return NotImplemented
return ((self.lastname.lower(), self.firstname.lower())
==
(other.lastname.lower(),
other.firstname.lower()))
def __lt__(self, other):
if not self._is_valid_operand(other):
return NotImplemented
return ((self.lastname.lower(), self.firstname.lower()) <
(other.lastname.lower(),
other.firstname.lower()))
Note
Même si ce décorateur permet de créer des types ordonnables facilement, cela vient
avec un coût d'exécution et des traces d'exécution complexes pour les méthodes de
comparaison dérivées. Si des tests de performances le révèlent comme un goulot
d'étranglement, l'implémentation manuelle des six méthodes de comparaison riches
résoudra normalement vos problèmes de rapidité.
functools.partial(func, *args, **keywords)
partial() est utilisé pour une application de fonction partielle qui "gèle" une portion
des arguments et/ou mots-clés d'une fonction donnant un nouvel objet avec une
signature simplifiée. Par exemple, partial() peut être utilisé pour créer un
appelable qui se comporte comme la fonction int() ou l'argument base est deux
par défaut :
Exemple :
>>>
functools.reduce(function, iterable[, initializer])
>>>
>>>
>>> @fun.register
... def _(arg: int, verbose=False):
... if verbose:
... print("Strength in numbers, eh?", end=" ")
... print(arg)
...
>>> @fun.register
... def _(arg: list, verbose=False):
... if verbose:
... print("Enumerate this:")
... for i, elem in enumerate(arg):
... print(i, elem)
Pour le code qui n’utilise pas les indications de type, le type souhaité peut être passé
explicitement en argument au décorateur :
>>>
>>> @fun.register(complex)
... def _(arg, verbose=False):
... if verbose:
... print("Better than complicated.", end=" ")
... print(arg.real, arg.imag)
...
>>>
>>>
>>> @fun.register(float)
... @fun.register(Decimal)
... def fun_num(arg, verbose=False):
... if verbose:
... print("Half of your number:", end=" ")
... print(arg / 2)
...
>>> fun_num is fun
False
Quand elle est appelée, la fonction générique distribue sur le type du premier
argument :
>>>
Quand il n'y a pas d'implémentation enregistrée pour un type spécifique, son ordre
de résolution de méthode est utilisé pour trouver une implémentation plus générique.
La fonction originale est décorée avec @singledispatch est enregistrée pour le
type d'object, et elle sera utilisée si aucune implémentation n'est trouvée.
>>>
>>> fun.dispatch(float)
<function fun_num at 0x1035a2840>
>>> fun.dispatch(dict) # note: default implementation
<function fun at 0x103fe0000>
>>>
>>> fun.registry.keys()
dict_keys([<class 'NoneType'>, <class 'int'>, <class 'object'>,
<class 'decimal.Decimal'>, <class 'list'>,
<class 'float'>])
>>> fun.registry[float]
<function fun_num at 0x1035a2840>
>>> fun.registry[object]
<function fun at 0x103fe0000>
Nouveau dans la version 3.4.
functools.update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNM
ENTS, updated=WRAPPER_UPDATES)
update_wrapper() peut être utilisé avec des appelables autres que des fonctions.
Tout attribut défini dans assigned ou updated qui ne sont pas l'objet englobé sont
ignorés (cette fonction n'essaiera pas de les définir dans la fonction
englobante). AttributeError est toujours levée si le fonction englobante elle
même a des attributs non existants dans updated.
@functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAP
PER_UPDATES)
>>>
Objets partial
Les objets partial sont des objets appelables créés par partial(). Ils ont trois
attributs en lecture seule :
partial.func
Un objet ou une fonction appelable. Les appels à l'objet partial seront transmis
à func avec les nouveaux arguments et mots-clés.
partial.args
Les arguments positionnels qui seront ajoutés avant les arguments fournis lors de
l'appel d'un objet partial.
partial.keywords
Les fonctions de comparaison s'appliquent à tous les objets, et leur nom vient des
opérateurs de comparaison qu'elles implémentent :
operator.lt(a, b)
operator.le(a, b)
operator.eq(a, b)
operator.ne(a, b)
operator.ge(a, b)
operator.gt(a, b)
operator.__lt__(a, b)
operator.__le__(a, b)
operator.__eq__(a, b)
operator.__ne__(a, b)
operator.__ge__(a, b)
operator.__gt__(a, b)
operator.not_(obj)
operator.__not__(obj)
operator.truth(obj)
operator.is_(a, b)
Renvoie a is b. Vérifie si les deux paramètres sont le même objet.
operator.is_not(a, b)
operator.abs(obj)
operator.__abs__(obj)
operator.add(a, b)
operator.__add__(a, b)
operator.and_(a, b)
operator.__and__(a, b)
operator.floordiv(a, b)
operator.__floordiv__(a, b)
Renvoie a // b.
operator.index(a)
operator.__index__(a)
operator.inv(obj)
operator.invert(obj)
operator.__inv__(obj)
operator.__invert__(obj)
operator.lshift(a, b)
operator.__lshift__(a, b)
operator.mod(a, b)
operator.__mod__(a, b)
Renvoie``a % b``.
operator.mul(a, b)
operator.__mul__(a, b)
operator.matmul(a, b)
operator.__matmul__(a, b)
Renvoie a @ b.
operator.neg(obj)
operator.__neg__(obj)
operator.or_(a, b)
operator.__or__(a, b)
operator.pos(obj)
operator.__pos__(obj)
operator.pow(a, b)
operator.__pow__(a, b)
operator.rshift(a, b)
operator.__rshift__(a, b)
operator.sub(a, b)
operator.__sub__(a, b)
Renvoie a - b.
operator.truediv(a, b)
operator.__truediv__(a, b)
operator.xor(a, b)
operator.__xor__(a, b)
Les opérations sur séquences (et pour certaines, sur correspondances) sont :
operator.concat(a, b)
operator.__concat__(a, b)
operator.contains(a, b)
operator.__contains__(a, b)
operator.countOf(a, b)
operator.delitem(a, b)
operator.__delitem__(a, b)
operator.getitem(a, b)
operator.__getitem__(a, b)
Renvoie la valeur de a à l'indice b.
operator.indexOf(a, b)
operator.setitem(a, b, c)
operator.__setitem__(a, b, c)
Affecte c dans a à l'indice b.
operator.length_hint(obj, default=0)
operator.attrgetter(attr)
operator.attrgetter(*attrs)
Renvoie un objet appelable qui récupère attr de son opérande. Si plus d'un attribut
est demandé, renvoie un n-uplet d'attributs. Les noms des attributs peuvent aussi
comporter des points. Par exemple :
Avec f = attrgetter('name'), l'appel f(b) renvoie b.name.
Avec f = attrgetter('name', 'date'),
l'appel f(b) renvoie (b.name, b.date).
Après f = attrgetter('name.first', 'name.last'),
l'appel f(b) renvoie (b.name.first, b.name.last).
Équivalent à :
def attrgetter(*items):
if any(not isinstance(item, str) for item in items):
raise TypeError('attribute name must be a string')
if len(items) == 1:
attr = items[0]
def g(obj):
return resolve_attr(obj, attr)
else:
def g(obj):
return tuple(resolve_attr(obj, attr) for attr in
items)
return g
operator.itemgetter(*items)
Avec f = itemgetter(2), f(r) renvoie r[2].
Avec g = itemgetter(2, 5, 3), g(r) renvoie (r[2], r[5], r[3]).
Équivalent à :
def itemgetter(*items):
if len(items) == 1:
item = items[0]
def g(obj):
return obj[item]
else:
def g(obj):
return tuple(obj[item] for item in items)
return g
Les items en entrée peuvent être de n'importe quel type tant que celui-ci est géré par
la méthode __getitem__() de l'opérande. Les dictionnaires acceptent toute valeur
hachable. Les listes, n-uplets et chaînes de caractères acceptent un index ou une
tranche :
>>> itemgetter(1)('ABCDEFG')
'B'
>>> itemgetter(1,3,5)('ABCDEFG')
('B', 'D', 'F')
>>> itemgetter(slice(2,None))('ABCDEFG')
'CDEFG'
>>> soldier = dict(rank='captain', name='dotterbart')
>>> itemgetter('rank')(soldier)
'captain'
Avec f = methodcaller('name'), f(b) renvoie b.name().
Avec f = methodcaller('name', 'foo', bar=1), f(b) renvoie b.name
('foo', bar=1).
Équivalent à :
Test
obj in seq contains(seq, obj)
d'inclusion
Opération Syntaxe Fonction
Ou exclusif bit
a ^ b xor(a, b)
à bit
Inversion bit à
~ a invert(a)
bit
Exponentiatio
a ** b pow(a, b)
n
Affectation par
obj[k] = v setitem(obj, k, v)
index
Suppression
del obj[k] delitem(obj, k)
par index
Décalage bit à
a << b lshift(a, b)
bit gauche
Modulo a % b mod(a, b)
Multiplication
a @ b matmul(a, b)
matricielle
Négation
not a not_(a)
(logique)
Valeur
+ a pos(a)
positive
Décalage bit à
a >> b rshift(a, b)
bit droite
tranche
Suppression
del seq[i:j] delitem(seq, slice(i, j))
par tranche
Formatage de
chaînes de s % obj mod(s, obj)
caractères
Test de
Obj truth(obj)
véracité
Opérateurs en-place
Beaucoup d'opérations ont une version travaillant « en-place ». Les fonctions listées
ci-dessous fournissent un accès plus direct aux opérateurs en-place que la syntaxe
Python habituelle ; par exemple, l'expression statement x += y équivaut
à x = operator.iadd(x, y). Autrement dit,
l'expression z = operator.iadd(x, y) équivaut à l'expression
composée z = x; z += y.
Dans ces exemples, notez que lorsqu'une méthode en-place est appelée, le calcul et
l'affectation sont effectués en deux étapes distinctes. Les fonctions en-place de la
liste ci-dessous ne font que la première, en appelant la méthode en-place. La
seconde étape, l'affectation, n'est pas effectuée.
Pour des paramètres non-mutables comme les chaînes de caractères, les nombres
et les n-uplets, la nouvelle valeur est calculée, mais pas affectée à la variable
d'entrée:
>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'
Pour des paramètres mutables comme les listes et les dictionnaires, la méthode en-
place modifiera la valeur, aucune affectation ultérieure n'est nécessaire :
operator.__iadd__(a, b)
a = iadd(a, b) équivaut à a += b.
operator.iand(a, b)
operator.__iand__(a, b)
a = iand(a, b) équivaut à a &= b.
operator.iconcat(a, b)
operator.__iconcat__(a, b)
operator.ifloordiv(a, b)
operator.__ifloordiv__(a, b)
a = ifloordiv(a, b)``équivaut à ``a //= b.
operator.ilshift(a, b)
operator.__ilshift__(a, b)
a = ilshift(a, b) équivaut à a <<= b.
operator.imod(a, b)
operator.__imod__(a, b)
a = imod(a, b) équivaut à a %= b.
operator.imul(a, b)
operator.__imul__(a, b)
a = imul(a, b) équivaut à a *= b.
operator.imatmul(a, b)
operator.__imatmul__(a, b)
a = imatmul(a, b) équivaut à a @= b.
operator.ior(a, b)
operator.__ior__(a, b)
a = ior(a, b) équivaut à a |= b.
operator.ipow(a, b)
operator.__ipow__(a, b)
a = ipow(a, b) équivaut à a **= b.
operator.irshift(a, b)
operator.__irshift__(a, b)
a = irshift(a, b) équivaut à a >>= b.
operator.isub(a, b)
operator.__isub__(a, b)
a = isub(a, b) équivaut à a -= b.
operator.itruediv(a, b)
operator.__itruediv__(a, b)
a = itruediv(a, b) équivaut à a /= b.
operator.ixor(a, b)
operator.__ixor__(a, b)
a = ixor(a, b) équivaut à a ^= b.
Voir aussi
Module os
Interfaces du système d'exploitation, incluant des fonctions pour travailler avec des
fichiers dans un niveau plus bas que les objets fichiers de Python.
Module io
Le moyen classique pour ouvrir des fichiers pour les lire ou y écrire avec Python.
Les chemins purs sont utiles dans certains cas particuliers ; par exemple :
1. Si vous voulez manipuler des chemins Windows sur une machine Unix (ou
vice versa). Vous ne pouvez pas instancier un WindowsPath quand vous êtes sous
Unix, mais vous pouvez instancier PureWindowsPath.
2. Vous voulez être sûr que votre code manipule des chemins sans réellement
accéder au système d'exploitation. Dans ce cas, instancier une de ces classes pures
peut être utile puisqu'elle ne possède tout simplement aucune opération permettant
d'accéder au système d'exploitation.
Voir aussi
Utilisation basique
Importer la classe principale :
>>>
>>>
>>> p = Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
PosixPath('__pycache__'), PosixPath('build')]
>>>
>>> list(p.glob('**/*.py'))
[PosixPath('test_pathlib.py'), PosixPath('setup.py'),
PosixPath('pathlib.py'), PosixPath('docs/conf.py'),
PosixPath('build/lib/pathlib.py')]
>>>
>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')
>>>
>>> q.exists()
True
>>> q.is_dir()
False
Ouvrir un fichier :
>>>
Chemins purs
Les objets chemins purs fournissent les opérations de gestion de chemin qui
n'accèdent pas réellement au système de fichiers. Il y a trois façons d'accéder à ces
classes que nous appelons aussi familles :
class pathlib.PurePath(*pathsegments)
>>>
>>> PurePath('setup.py') # Running on a Unix machine
PurePosixPath('setup.py')
>>>
>>>
>>> PurePath()
PurePosixPath('.')
Quand plusieurs chemins absolus sont fournis, le dernier est pris comme ancre
(recopiant le comportement de os.path.join()) :
>>>
>>>
Les points et slashs malencontreux sont supprimés, mais les doubles points ( '..')
ne le sont pas, puisque cela changerait la signification du chemin dans le cas de
liens symboliques :
>>>
>>> PurePath('foo//bar')
PurePosixPath('foo/bar')
>>> PurePath('foo/./bar')
PurePosixPath('foo/bar')
>>> PurePath('foo/../bar')
PurePosixPath('foo/../bar')
class pathlib.PurePosixPath(*pathsegments)
>>>
>>> PurePosixPath('/etc')
PurePosixPath('/etc')
class pathlib.PureWindowsPath(*pathsegments)
>>>
Sans tenir compte du système sur lequel vous êtes, vous pouvez instancier toutes
ces classes, puisqu'elles ne fournissent aucune opération qui appelle le système
d'exploitation.
Propriétés générales
Les chemins sont immuables et hachables. Les chemins d'une même famille sont
comparables et ordonnables. Ces propriétés respectent l'ordre lexicographique défini
par la famille :
>>>
Les chemins de différentes familles ne sont pas égaux et ne peuvent être ordonnés :
>>>
Opérateurs
L'opérateur slash aide à créer les chemins enfants, de manière similaire
à os.path.join() :
>>>
>>> p = PurePath('/etc')
>>> p
PurePosixPath('/etc')
>>> p / 'init.d' / 'apache2'
PurePosixPath('/etc/init.d/apache2')
>>> q = PurePath('bin')
>>> '/usr' / q
PurePosixPath('/usr/bin')
>>> import os
>>> p = PurePath('/etc')
>>> os.fspath(p)
'/etc'
>>>
>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
>>>
>>> bytes(p)
b'/etc'
Note
PurePath.parts
>>>
>>> p = PurePath('/usr/bin/python3')
>>> p.parts
('/', 'usr', 'bin', 'python3')
(notez comme le lecteur et la racine locale sont regroupés en une seule partie)
Méthodes et propriétés
Les chemins purs fournissent les méthodes et propriétés suivantes :
PurePath.drive
>>>
>>>
>>> PureWindowsPath('//host/share/foo.txt').drive
'\\\\host\\share'
PurePath.root
>>>
>>> PureWindowsPath('//host/share').root
'\\'
PurePath.anchor
>>>
>>>
>>> p = PureWindowsPath('c:/foo/bar/setup.py')
>>> p.parents[0]
PureWindowsPath('c:/foo/bar')
>>> p.parents[1]
PureWindowsPath('c:/foo')
>>> p.parents[2]
PureWindowsPath('c:/')
PurePath.parent
>>>
>>> p = PurePosixPath('/a/b/c/d')
>>> p.parent
PurePosixPath('/a/b/c')
Vous ne pouvez pas aller au-delà d'une ancre, ou d'un chemin vide :
>>>
>>> p = PurePosixPath('/')
>>> p.parent
PurePosixPath('/')
>>> p = PurePosixPath('.')
>>> p.parent
PurePosixPath('.')
Note
>>> p = PurePosixPath('foo/..')
>>> p.parent
PurePosixPath('foo')
>>>
>>> PurePosixPath('my/library/setup.py').name
'setup.py'
>>>
>>> PureWindowsPath('//some/share/setup.py').name
'setup.py'
>>> PureWindowsPath('//some/share').name
''
PurePath.suffix
>>>
>>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
''
PurePath.suffixes
>>>
>>> PurePosixPath('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]
PurePath.stem
>>>
>>> PurePosixPath('my/library.tar.gz').stem
'library.tar'
>>> PurePosixPath('my/library.tar').stem
'library'
>>> PurePosixPath('my/library').stem
'library'
PurePath.as_posix()
Renvoie une représentation en chaîne de caractères du chemin avec des slashs ( /) :
>>>
>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'
PurePath.as_uri()
>>> p = PurePosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = PureWindowsPath('c:/Windows')
>>> p.as_uri()
'file:///c:/Windows'
PurePath.is_absolute()
Renvoie si le chemin est absolu ou non. Un chemin est considéré absolu s'il a une
racine et un lecteur (si la famille le permet) :
>>>
>>> PurePosixPath('/a/b').is_absolute()
True
>>> PurePosixPath('a/b').is_absolute()
False
>>> PureWindowsPath('c:/a/b').is_absolute()
True
>>> PureWindowsPath('/a/b').is_absolute()
False
>>> PureWindowsPath('c:').is_absolute()
False
>>> PureWindowsPath('//some/share').is_absolute()
True
PurePath.is_reserved()
>>> PureWindowsPath('nul').is_reserved()
True
>>> PurePosixPath('nul').is_reserved()
False
Les appels au système de fichier sur des chemins réservés peuvent échouer
mystérieusement ou avoir des effets inattendus.
PurePath.joinpath(*other)
>>>
>>> PurePosixPath('/etc').joinpath('passwd')
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
PurePosixPath('/etc/init.d/apache2')
>>> PureWindowsPath('c:').joinpath('/Program Files')
PureWindowsPath('c:/Program Files')
PurePath.match(pattern)
Si pattern est relatif, le chemin peut être soit relatif, soit absolu, et la correspondance
est faite à partir de la droite :
>>>
>>> PurePath('a/b.py').match('*.py')
True
>>> PurePath('/a/b/c.py').match('b/*.py')
True
>>> PurePath('/a/b/c.py').match('a/*.py')
False
Si pattern est absolu, le chemin doit être absolu, et la correspondance doit être totale
avec le chemin :
>>>
>>> PurePath('/a.py').match('/*.py')
True
>>> PurePath('a/b.py').match('/*.py')
False
>>>
>>> PurePosixPath('b.py').match('*.PY')
False
>>> PureWindowsPath('b.py').match('*.PY')
True
PurePath.relative_to(*other)
>>>
>>> p = PurePosixPath('/etc/passwd')
>>> p.relative_to('/')
PurePosixPath('etc/passwd')
>>> p.relative_to('/etc')
PurePosixPath('passwd')
>>> p.relative_to('/usr')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pathlib.py", line 694, in relative_to
.format(str(self), str(formatted)))
ValueError: '/etc/passwd' does not start with '/usr'
PurePath.with_name(name)
>>>
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_name('setup.py')
PureWindowsPath('c:/Downloads/setup.py')
>>> p = PureWindowsPath('c:/')
>>> p.with_name('setup.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/antoine/cpython/default/Lib/pathlib.py", line 751,
in with_name
raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
PurePath.with_suffix(suffix)
>>>
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_suffix('.bz2')
PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
>>> p = PureWindowsPath('README')
>>> p.with_suffix('.txt')
PureWindowsPath('README.txt')
>>> p = PureWindowsPath('README.txt')
>>> p.with_suffix('')
PureWindowsPath('README')
Chemins concrets
Les chemins concrets sont des sous-classes des chemins purs. En plus des
opérations fournies par ces derniers, ils fournissent aussi des méthodes pour faire
appel au système sur des objets chemin. Il y a trois façons d'instancier des chemins
concrets :
class pathlib.Path(*pathsegments)
Une sous-classe de PurePath, cette classe représente les chemins concrets d'une
famille de chemins de système de fichiers (l'instancier créé soit un PosixPath, soit
un WindowsPath) :
>>>
>>> Path('setup.py')
PosixPath('setup.py')
class pathlib.PosixPath(*pathsegments)
>>>
>>> PosixPath('/etc')
PosixPath('/etc')
class pathlib.WindowsPath(*pathsegments)
>>>
>>>
>>> import os
>>> os.name
'posix'
>>> Path('setup.py')
PosixPath('setup.py')
>>> PosixPath('setup.py')
PosixPath('setup.py')
>>> WindowsPath('setup.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pathlib.py", line 798, in __new__
% (cls.__name__,))
NotImplementedError: cannot instantiate 'WindowsPath' on your
system
Méthodes
Les chemins concrets fournissent les méthodes suivantes en plus des méthodes des
chemins purs. Beaucoup de ces méthodes peuvent lever OSError si un appel au
système échoue (par exemple car le chemin n'existe pas) :
classmethod Path.cwd()
>>>
>>> Path.cwd()
PosixPath('/home/antoine/pathlib')
classmethod Path.home()
>>>
>>> Path.home()
PosixPath('/home/antoine')
>>>
>>> p = Path('setup.py')
>>> p.stat().st_size
956
>>> p.stat().st_mtime
1327883547.852554
Path.chmod(mode)
>>>
>>> p = Path('setup.py')
>>> p.stat().st_mode
33277
>>> p.chmod(0o444)
>>> p.stat().st_mode
33060
Path.exists()
>>>
>>> Path('.').exists()
True
>>> Path('setup.py').exists()
True
>>> Path('/etc').exists()
True
>>> Path('nonexistentfile').exists()
False
Note
Path.glob(pattern)
>>>
>>> sorted(Path('.').glob('*.py'))
[PosixPath('pathlib.py'), PosixPath('setup.py'),
PosixPath('test_pathlib.py')]
>>> sorted(Path('.').glob('*/*.py'))
[PosixPath('docs/conf.py')]
>>>
>>> sorted(Path('.').glob('**/*.py'))
[PosixPath('build/lib/pathlib.py'),
PosixPath('docs/conf.py'),
PosixPath('pathlib.py'),
PosixPath('setup.py'),
PosixPath('test_pathlib.py')]
Note
Path.is_dir()
Path.is_file()
False est aussi renvoyé si le chemin n'existe pas ou est un lien symbolique cassé ;
d'autres erreurs (telles que les erreurs de permission) sont propagées.
Path.is_mount()
Path.is_symlink()
False est aussi renvoyé si le chemin n'existe pas ; d'autres erreurs (telles que les
erreurs de permission) sont propagées.
Path.is_socket()
False est aussi renvoyé si le chemin n'existe pas ou est un lien symbolique cassé ;
d'autres erreurs (telles que les erreurs de permission) sont propagées.
Path.is_fifo()
Renvoie True si le chemin pointe vers une FIFO (ou un lien symbolique pointant vers
une FIFO), False s'il pointe vers une autre sorte de fichier.
False est aussi renvoyé si le chemin n'existe pas ou est un lien symbolique cassé ;
d'autres erreurs (telles que les erreurs de permission) sont propagées.
Path.is_block_device()
False est aussi renvoyé si le chemin n'existe pas ou est un lien symbolique cassé ;
d'autres erreurs (telles que les erreurs de permission) sont propagées.
Path.is_char_device()
False est aussi renvoyé si le chemin n'existe pas ou est un lien symbolique cassé ;
d'autres erreurs (telles que les erreurs de permission) sont propagées.
Path.iterdir()
Quand le chemin pointe vers un dossier, donne les chemins du contenu du dossier :
>>>
>>> p = Path('docs')
>>> for child in p.iterdir(): child
...
PosixPath('docs/conf.py')
PosixPath('docs/_templates')
PosixPath('docs/make.bat')
PosixPath('docs/index.rst')
PosixPath('docs/_build')
PosixPath('docs/_static')
PosixPath('docs/Makefile')
Path.lchmod(mode)
Path.lstat()
Path.mkdir(mode=0o777, parents=False, exist_ok=False)
Créer un nouveau dossier au chemin fourni. Si mode est fourni, il est combiné avec
la valeur de l'umask du processus pour déterminer le mode de fichier et les droits
d'accès. Si le chemin existe déjà, FileExistsError est levée.
Si parents est vrai, chaque parent de ce chemin est créé si besoin ; ils sont créés
avec les permissions par défaut sans prendre en compte mode (reproduisant la
commande POSIX mkdir -p).
Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
>>>
>>> p = Path('setup.py')
>>> with p.open() as f:
... f.readline()
...
'#!/usr/bin/env python3\n'
Path.owner()
Path.read_bytes()
>>>
>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'
Path.read_text(encoding=None, errors=None)
>>>
>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'
Le fichier est ouvert, puis fermé. Les paramètres optionnels ont la même signification
que dans open().
Path.rename(target)
>>>
>>> p = Path('foo')
>>> p.open('w').write('some text')
9
>>> target = Path('bar')
>>> p.rename(target)
>>> target.open().read()
'some text'
Path.replace(target)
Path.resolve(strict=False)
Rend le chemin absolu, résolvant les liens symboliques. Un nouveau chemin est
renvoyé :
>>>
>>> p = Path()
>>> p
PosixPath('.')
>>> p.resolve()
PosixPath('/home/antoine/pathlib')
Les composantes ".." sont aussi éliminées (c'est la seule méthode pour le faire) :
>>>
>>> p = Path('docs/../setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
Path.rglob(pattern)
>>>
>>> sorted(Path().rglob("*.py"))
[PosixPath('build/lib/pathlib.py'),
PosixPath('docs/conf.py'),
PosixPath('pathlib.py'),
PosixPath('setup.py'),
PosixPath('test_pathlib.py')]
Path.rmdir()
Path.samefile(other_path)
Renvoie si ce chemin pointe vers le même fichier que other_path, qui peut être soit
un chemin, soit une chaîne de caractères. La sémantique est similaire
à os.path.samefile() et os.path.samestat().
OSError peut être levée si l'un des fichiers ne peut être accédé pour quelque raison.
>>>
>>> p = Path('spam')
>>> q = Path('eggs')
>>> p.samefile(q)
False
>>> p.samefile('spam')
True
Path.symlink_to(target, target_is_directory=False)
>>>
>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
>>> p.stat().st_size
956
>>> p.lstat().st_size
8
Note
Créer un fichier au chemin donné. Si mode est fourni, il est combiné avec la valeur
de l'umask du processus pour déterminer le mode du fichier et les drapeaux d'accès.
Si le fichier existe déjà, la fonction réussit si exist_ok est vrai (et si l'heure de
modification est mise à jour avec l'heure courante), sinon FileExistsError est
levée.
Path.unlink()
Path.write_bytes(data)
>>>
>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'
Path.write_text(data, encoding=None, errors=None)
>>>
>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'
Note
Ce module implémente certaines fonctions utiles sur le nom des chemins. Pour lire
ou écrire des fichiers, voir open(), et pour accéder au système de fichier, voir le
module os. Les paramètres de chemin d’accès peuvent être passés sous forme de
chaînes de caractères ou de chaîne d'octets. Les programmes sont encouragés à
représenter les noms de fichiers en tant que chaînes de caractères Unicode.
Malheureusement, certains noms de fichiers peuvent ne pas être représentés sous
forme de chaînes de caractères sous UNIX, ainsi, les programmes qui doivent
prendre en charge les noms de fichiers arbitraires sur UNIX doivent utiliser des
chaînes d'octets pour représenter leurs chemins d’accès. Inversement, l’utilisation de
chaîne d'octets ne peut pas représenter tous les noms de fichiers sous Windows
(dans le codage mbcs standard), par conséquent les applications Windows doivent
utiliser des chaînes de caractères Unicode pour accéder à tous les fichiers.
Voir aussi
Toutes ces fonctions n'acceptent que des chaînes d'octets ou des chaînes de
caractères en tant que paramètres. Le résultat est un objet du même type si un
chemin ou un nom de fichier est renvoyé.
Note
os.path.basename(path)
Renvoie le nom de base du chemin d'accès path. C'est le second élément de la paire
renvoyée en passant path à la fonction split(). Notez que le résultat de cette
fonction est différent de celui du programme Unix basename ; là
où basename pour '/foo/bar/' renvoie 'bar', la fonction basename() renvoie
une chaîne vide ('').
os.path.commonpath(paths)
os.path.commonprefix(list)
Return the longest path prefix (taken character-by-character) that is a prefix of all
paths in list. If list is empty, return the empty string ('').
Note
This function may return invalid paths because it works a character at a time. To
obtain a valid path, see commonpath().
>>>
os.path.dirname(path)
Return the directory name of pathname path. This is the first element of the pair
returned by passing path to the function split().
Modifié dans la version 3.6: Accepte un path-like object.
os.path.exists(path)
os.path.lexists(path)
os.path.expanduser(path)
If the expansion fails or if the path does not begin with a tilde, the path is returned
unchanged.
os.path.expandvars(path)
os.path.getatime(path)
Return the time of last access of path. The return value is a floating point number
giving the number of seconds since the epoch (see the time module).
Raise OSError if the file does not exist or is inaccessible.
os.path.getmtime(path)
Return the time of last modification of path. The return value is a floating point
number giving the number of seconds since the epoch (see the time module).
Raise OSError if the file does not exist or is inaccessible.
os.path.getctime(path)
Return the system's ctime which, on some systems (like Unix) is the time of the last
metadata change, and, on others (like Windows), is the creation time for path. The
return value is a number giving the number of seconds since the epoch (see
the time module). Raise OSError if the file does not exist or is inaccessible.
os.path.getsize(path)
Return the size, in bytes, of path. Raise OSError if the file does not exist or is
inaccessible.
os.path.isabs(path)
os.path.isdir(path)
os.path.islink(path)
os.path.ismount(path)
os.path.join(path, *paths)
Join one or more path components intelligently. The return value is the concatenation
of path and any members of *paths with exactly one directory separator ( os.sep)
following each non-empty part except the last, meaning that the result will only end in
a separator if the last part is empty. If a component is an absolute path, all previous
components are thrown away and joining continues from the absolute path
component.
On Windows, the drive letter is not reset when an absolute path component
(e.g., r'\foo') is encountered. If a component contains a drive letter, all previous
components are thrown away and the drive letter is reset. Note that since there is a
current directory for each drive, os.path.join("c:", "foo") represents a path
relative to the current directory on drive C: (c:foo), not c:\foo.
os.path.normcase(path)
os.path.normpath(path)
os.path.realpath(path)
Return the canonical path of the specified filename, eliminating any symbolic links
encountered in the path (if they are supported by the operating system).
os.path.relpath(path, start=os.curdir)
start defaults to os.curdir.
os.path.samefile(path1, path2)
Return True if both pathname arguments refer to the same file or directory. This is
determined by the device number and i-node number and raises an exception if
an os.stat() call on either pathname fails.
Modifié dans la version 3.4: Windows now uses the same implementation as all other
platforms.
os.path.sameopenfile(fp1, fp2)
os.path.samestat(stat1, stat2)
os.path.split(path)
os.path.splitdrive(path)
If the path contains a drive letter, drive will contain everything up to and including the
colon. e.g. splitdrive("c:/dir") returns ("c:", "/dir")
If the path contains a UNC path, drive will contain the host name and share, up to but
not including the fourth separator.
e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/
dir")
os.path.splitext(path)
os.path.supports_unicode_filenames
True if arbitrary Unicode strings can be used as file names (within limitations
imposed by the file system).
import fileinput
for line in fileinput.input():
process(line)
This iterates over the lines of all files listed in sys.argv[1:], defaulting
to sys.stdin if the list is empty. If a filename is '-', it is also replaced
by sys.stdin and the optional arguments mode and openhook are ignored. To
specify an alternative list of filenames, pass it as the first argument to input(). A
single file name is also allowed.
All files are opened in text mode by default, but you can override this by specifying
the mode parameter in the call to input() or FileInput. If an I/O error occurs
during opening or reading a file, OSError is raised.
If sys.stdin is used more than once, the second and further use will return no lines,
except perhaps for interactive use, or if it has been explicitly reset (e.g.
using sys.stdin.seek(0)).
Empty files are opened and immediately closed; the only time their presence in the
list of filenames is noticeable at all is when the last file opened is empty.
Lines are returned with any newlines intact, which means that the last line in a file
may not have one.
You can control how files are opened by providing an opening hook via
the openhook parameter to fileinput.input() or FileInput(). The hook must
be a function that takes two arguments, filename and mode, and returns an
accordingly opened file-like object. Two useful hooks are already provided by this
module.
The following functions use the global state created by fileinput.input(); if there
is no active state, RuntimeError is raised.
fileinput.filename()
Return the name of the file currently being read. Before the first line has been read,
returns None.
fileinput.fileno()
Return the integer "file descriptor" for the current file. When no file is opened (before
the first line and between files), returns -1.
fileinput.lineno()
Return the cumulative line number of the line that has just been read. Before the first
line has been read, returns 0. After the last line of the last file has been read, returns
the line number of that line.
fileinput.filelineno()
Return the line number in the current file. Before the first line has been read,
returns 0. After the last line of the last file has been read, returns the line number of
that line within the file.
fileinput.isfirstline()
Return True if the line just read is the first line of its file, otherwise return False.
fileinput.isstdin()
fileinput.nextfile()
Close the current file so that the next iteration will read the first line from the next file
(if any); lines not read from the file will not count towards the cumulative line count.
The filename is not changed until after the first line of the next file has been read.
Before the first line has been read, this function has no effect; it cannot be used to
skip the first file. After the last line of the last file has been read, this function has no
effect.
fileinput.close()
The class which implements the sequence behavior provided by the module is
available for subclassing as well:
class fileinput.FileInput(files=None, inplace=False, backup='', bufsize=0, mode
='r', openhook=None)
With mode you can specify which file mode will be passed to open(). It must be one
of 'r', 'rU', 'U' and 'rb'.
fileinput.hook_compressed(filename, mode)
Transparently opens files compressed with gzip and bzip2 (recognized by the
extensions '.gz' and '.bz2') using the gzip and bz2 modules. If the filename
extension is not '.gz' or '.bz2', the file is opened normally (ie,
using open() without any decompression).
Usage
example: fi = fileinput.FileInput(openhook=fileinput.hook_compresse
d)
fileinput.hook_encoded(encoding, errors=None)
Usage
example: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("
utf-8", "surrogateescape"))
The stat module defines the following functions to test for specific file types:
stat.S_ISDIR(mode)
stat.S_ISCHR(mode)
stat.S_ISBLK(mode)
stat.S_ISREG(mode)
stat.S_ISFIFO(mode)
stat.S_ISLNK(mode)
stat.S_ISSOCK(mode)
stat.S_ISDOOR(mode)
stat.S_ISPORT(mode)
stat.S_ISWHT(mode)
Two additional functions are defined for more general manipulation of the file's mode:
stat.S_IMODE(mode)
Return the portion of the file's mode that can be set by os.chmod()---that is, the
file's permission bits, plus the sticky bit, set-group-id, and set-user-id bits (on systems
that support them).
stat.S_IFMT(mode)
Return the portion of the file's mode that describes the file type (used by
the S_IS*() functions above).
Normally, you would use the os.path.is*() functions for testing the type of a file;
the functions here are useful when you are doing multiple tests of the same file and
wish to avoid the overhead of the stat() system call for each test. These are also
useful when checking for information about a file that isn't handled by os.path, like
the tests for block and character devices.
Exemple :
for f in os.listdir(top):
pathname = os.path.join(top, f)
mode = os.stat(pathname).st_mode
if S_ISDIR(mode):
# It's a directory, recurse into it
walktree(pathname, callback)
elif S_ISREG(mode):
# It's a file, call the callback function
callback(pathname)
else:
# Unknown file type, print a message
print('Skipping %s' % pathname)
def visitfile(file):
print('visiting', file)
if __name__ == '__main__':
walktree(sys.argv[1], visitfile)
stat.filemode(mode)
All the variables below are simply symbolic indexes into the 10-tuple returned
by os.stat(), os.fstat() or os.lstat().
stat.ST_MODE
stat.ST_INO
Numéro d'inode.
stat.ST_DEV
stat.ST_NLINK
stat.ST_UID
User id of the owner.
stat.ST_GID
stat.ST_SIZE
Size in bytes of a plain file; amount of data waiting on some special files.
stat.ST_ATIME
stat.ST_MTIME
stat.ST_CTIME
The "ctime" as reported by the operating system. On some systems (like Unix) is the
time of the last metadata change, and, on others (like Windows), is the creation time
(see platform documentation for details).
The interpretation of "file size" changes according to the file type. For plain files this is
the size of the file in bytes. For FIFOs and sockets under most flavors of Unix
(including Linux in particular), the "size" is the number of bytes waiting to be read at
the time of the call to os.stat(), os.fstat(), or os.lstat(); this can sometimes
be useful, especially for polling one of these special files after a non-blocking open.
The meaning of the size field for other character and block devices varies more,
depending on the implementation of the underlying system call.
Use of the functions above is more portable than use of the first set of flags:
stat.S_IFSOCK
Socket.
stat.S_IFLNK
Symbolic link.
stat.S_IFREG
Regular file.
stat.S_IFBLK
Block device.
stat.S_IFDIR
Dossier.
stat.S_IFCHR
Character device.
stat.S_IFIFO
FIFO.
stat.S_IFDOOR
Door.
stat.S_IFPORT
Event port.
stat.S_IFWHT
Whiteout.
Note
stat.S_ISUID
stat.S_ISGID
Set-group-ID bit. This bit has several special uses. For a directory it indicates that
BSD semantics is to be used for that directory: files created there inherit their group
ID from the directory, not from the effective group ID of the creating process, and
directories created there will also get the S_ISGID bit set. For a file that does not
have the group execution bit ( S_IXGRP) set, the set-group-ID bit indicates mandatory
file/record locking (see also S_ENFMT).
stat.S_ISVTX
Sticky bit. When this bit is set on a directory it means that a file in that directory can
be renamed or deleted only by the owner of the file, by the owner of the directory, or
by a privileged process.
stat.S_IRWXU
stat.S_IRUSR
stat.S_IWUSR
stat.S_IXUSR
stat.S_IRWXG
stat.S_IRGRP
stat.S_IWGRP
stat.S_IXGRP
stat.S_IRWXO
stat.S_IWOTH
stat.S_IXOTH
stat.S_ENFMT
stat.S_IREAD
stat.S_IWRITE
stat.S_IEXEC
stat.UF_NODUMP
stat.UF_IMMUTABLE
stat.UF_APPEND
stat.UF_OPAQUE
stat.UF_NOUNLINK
The file may not be renamed or deleted.
stat.UF_COMPRESSED
stat.UF_HIDDEN
stat.SF_ARCHIVED
stat.SF_IMMUTABLE
stat.SF_APPEND
stat.SF_NOUNLINK
stat.SF_SNAPSHOT
On Windows, the following file attribute constants are available for use when testing
bits in the st_file_attributes member returned by os.stat(). See
the Windows API documentation for more detail on the meaning of these constants.
stat.FILE_ATTRIBUTE_ARCHIVE
stat.FILE_ATTRIBUTE_COMPRESSED
stat.FILE_ATTRIBUTE_DEVICE
stat.FILE_ATTRIBUTE_DIRECTORY
stat.FILE_ATTRIBUTE_ENCRYPTED
stat.FILE_ATTRIBUTE_HIDDEN
stat.FILE_ATTRIBUTE_INTEGRITY_STREAM
stat.FILE_ATTRIBUTE_NORMAL
stat.FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
stat.FILE_ATTRIBUTE_NO_SCRUB_DATA
stat.FILE_ATTRIBUTE_OFFLINE
stat.FILE_ATTRIBUTE_READONLY
stat.FILE_ATTRIBUTE_REPARSE_POINT
stat.FILE_ATTRIBUTE_SPARSE_FILE
stat.FILE_ATTRIBUTE_SYSTEM
stat.FILE_ATTRIBUTE_TEMPORARY
stat.FILE_ATTRIBUTE_VIRTUAL
filecmp.cmp(f1, f2, shallow=True)
Notez qu'aucun programme externe n'est appelé à partir de cette fonction, ce qui lui
confère des qualités de portabilité et d'efficacité.
Cette fonction utilise un cache pour les comparaisons antérieures et les résultats, les
entrées du cache étant invalidées si les informations os.stat() du fichier sont
modifiées. La totalité du cache peut être effacée avec clear_cache().
filecmp.cmpfiles(dir1, dir2, common, shallow=True)
Compare les fichiers des deux répertoires dir1 et dir2 dont les noms sont donnés
par common.
Par
exemple, cmpfiles('a', 'b', ['c', 'd/e']) compare a/c et b/c et a/d/e av
ec b/d/e. 'c' et 'd/e' seront chacun dans l'une des trois listes renvoyées.
filecmp.clear_cache()
Efface le cache filecmp. Cela peut être utile si un fichier est comparé juste après
avoir été modifié (dans un délai inférieur à la résolution mtime du système de fichiers
sous-jacent).
La classe dircmp
class filecmp.dircmp(a, b, ignore=None, hide=None)
report_partial_closure()
Affiche une comparaison entre a et b et les sous-répertoires immédiats communs.
report_full_closure()
Affiche une comparaison entre a et b et les sous-répertoires communs
(récursivement).
Notez que, via les points d'ancrage __getattr__(), tous les attributs sont calculés
de manière paresseuse. Il n'y a donc pas de pénalité en vitesse si seuls les attributs
rapides à calculer sont utilisés.
left
Le répertoire a.
right
Le répertoire b.
left_list
Fichiers et sous-répertoires dans a , filtrés par hide et ignore.
right_list
Fichiers et sous-répertoires dans b , filtrés par hide et ignore.
common
Fichiers et sous-répertoires à la fois dans a et b.
left_only
Fichiers et sous-répertoires uniquement dans a.
right_only
Fichiers et sous-répertoires uniquement dans b.
common_dirs
Sous-répertoires à la fois dans a et b.
common_files
Fichiers à la fois dans a et b.
common_funny
Noms dans a et b , tels que le type diffère entre les répertoires, ou noms pour
lesquels os.stat() signale une erreur.
same_files
Fichiers identiques dans a et b, en utilisant l'opérateur de comparaison de fichiers de
la classe.
diff_files
Fichiers figurant à la fois dans a et dans b , dont le contenu diffère en fonction de
l'opérateur de comparaison de fichiers de la classe.
funny_files
Fichiers à la fois dans a et dans b , mais ne pouvant pas être comparés.
subdirs
Un dictionnaire faisant correspondre les noms dans common_dirs vers des
objets dircmp.
filecmp.DEFAULT_IGNORES
>>>
Ce module crée des fichiers et répertoires temporaires. Il fonctionne sur toutes les
plateformes
supportées. TemporaryFile, NamedTemporaryFile, TemporaryDirectory,
et SpooledTemporaryFile sont des interfaces haut-niveau qui fournissent un
nettoyage automatique et peuvent être utilisées comme gestionnaire de
contexte. mkstemp() et mkdtemp() sont des fonctions bas-niveau qui nécessitent
un nettoyage manuel.
Toutes les fonctions et constructeurs appelables par l'utilisateur ont des arguments
additionnels qui permettent de contrôler directement le chemin et le nom des
répertoires et fichiers. Les noms de fichiers utilisés par ce module incluent une
chaîne de caractères aléatoires qui leur permet d'être créés de manière sécurisée
dans des répertoires temporaires partagés. Afin de maintenir la compatibilité
descendante, l'ordre des arguments est quelque peu étrange ; pour des questions de
clarté, il est recommandé d'utiliser les arguments nommés.
Le module définit les éléments suivants pouvant être appelés par l'utilisateur :
tempfile.TemporaryFile(mode='w+b', buffering=None, encoding=None, newline
=None, suffix=None, prefix=None, dir=None)
Renvoie un objet fichier qui peut être utilisé comme une zone de stockage
temporaire. Le fichier est créé de manière sécurisé, utilisant les mêmes règles
que mkstemp(). Il sera détruit dès qu'il sera fermé (y compris lorsque le fichier est
implicitement fermé quand il est collecté par le ramasse-miette). Sous Unix, l'entrée
du répertoire n'est soit pas du tout créée, ou est supprimée immédiatement après sa
création. Les autres plateformes ne gèrent pas cela, votre code ne doit pas compter
sur un fichier temporaire créé en utilisant cette fonction ayant ou non un nom visible
sur le système de fichier.
L'objet renvoyé est un véritable fichier sur les plateformes POSIX. Sur les autres
plateformes, un objet fichier-compatible est retourné où l'attribut file est le véritable
fichier.
tempfile.NamedTemporaryFile(mode='w+b', buffering=None, encoding=None,
newline=None, suffix=None, prefix=None, dir=None, delete=True)
tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=None,
encoding=None, newline=None, suffix=None, prefix=None, dir=None)
Cette fonction se comporte exactement comme TemporaryFile(), à l'exception
que les données sont stockées en mémoire jusqu'à ce que leur taille
dépasse max_size, ou que la méthode fileno() soit appelée. À ce moment, le
contenu est écrit sur disque et le fonctionnement redevient similaire à celui
de TemporaryFile().
tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)
Le nom du répertoire peut être récupéré via l'attribut name de l'objet renvoyé. Quand
l'objet renvoyé est utilisé comme gestionnaire de contexte, l'attribut name sera lié au
nom donné à la clause as de l'instruction with, si elle est spécifiée.
tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)
Crée un fichier temporaire de la manière la plus sécurisée qui soit. Il n'y a pas
d'accès concurrent (race condition) au moment de la création du fichier, en
supposant que la plateforme implémente correctement
l'option os.O_EXCL pour os.open(). Le fichier est seulement accessible en lecture
et écriture par l'ID de l'utilisateur créateur. Si la plateforme utilise des bits de
permissions pour indiquer si le fichier est exécutable, alors le fichier n'est exécutable
par personne. Le descripteur de fichier n'est pas hérité par les processus fils.
À la différence de TemporaryFile(), l'utilisateur de mkstemp() est responsable de
la suppression du fichier temporaire quand il n'en a plus besoin.
Si suffix ne vaut pas None, le nom de fichier se terminera avec ce suffixe, sinon il n'y
aura pas de suffixe. mkstemp() ne met pas de point entre le nom du fichier et le
suffixe. Si vous en avez besoin, mettez le point au début de suffix.
Si text est spécifié, cela indique si le fichier doit être ouvert en mode binaire (par
défaut) ou en mode texte. Sur certaines plateformes, cela ne fait aucune différence.
tempfile.mkdtemp(suffix=None, prefix=None, dir=None)
Crée un répertoire temporaire de la manière la plus sécurisée qu'il soit. Il n'y a pas
d'accès concurrent (race condition) au moment de la création du répertoire. Le
répertoire est accessible en lecture, en écriture, et son contenu lisible uniquement
pour l'ID de l'utilisateur créateur.
tempfile.gettempdir()
Renvoie le nom du répertoire utilisé pour les fichiers temporaires. C'est la valeur par
défaut pour l'argument dir de toutes les fonctions de ce module.
Python cherche un répertoire parmi une liste standard de répertoires dans lequel
l'utilisateur final peut créer des fichiers. La liste est :
tempfile.gettempdirb()
Renvoie le préfixe de nom de fichier utilisé pour créer les fichiers temporaires. Cela
ne contient pas le nom du répertoire.
tempfile.gettempprefixb()
Le module utilise une variable globale pour stocker le nom du répertoire utilisé pour
les fichiers temporaires renvoyés par gettempdir(). Vous pouvez directement
utiliser la variable globale pour surcharger le processus de sélection, mais ceci est
déconseillé. Toutes les fonctions de ce module prennent un argument dir qui peut
être utilisé pour spécifier le répertoire. Il s'agit de la méthode recommandée.
tempfile.tempdir
Quand une valeur autre que None est spécifiée, cette variable définit la valeur par
défaut pour l'argument dir des fonctions définies dans ce module.
Exemples
Voici quelques exemples classiques d'utilisation du module tempfile :
>>>
tempfile.mktemp(suffix='', prefix='tmp', dir=None)
Renvoie le chemin absolu d'un fichier qui n'existe pas lorsque l'appel est fait. Les
arguments prefix, suffix, et dir sont similaires à ceux de mkstemp() mais les noms
de fichiers en bytes, sufix=None et prefix=None ne sont pas implémentées.
Avertissement
Utiliser cette fonction peut introduire une faille de sécurité dans votre programme.
Avant que vous n'ayez le temps de faire quoi que ce soit avec le nom de fichier
renvoyé, quelqu'un peut l'utiliser. L'utilisation de mktemp() peut être remplacée
facilement avec NamedTemporaryFile() en y passant le
paramètre delete=False :
>>>
>>> f = NamedTemporaryFile(delete=False)
>>> f.name
'/tmp/tmptjujjt'
>>> f.write(b"Hello World!\n")
13
>>> f.close()
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False
Pour une correspondance littérale, il faut entourer le métacaractère par des crochets.
Par exemple, '[?]' reconnaît le caractère '?'.
Voir aussi
Note
Modifié dans la version 3.5: Gestion des chemins récursifs utilisant le motif " **".
glob.iglob(pathname, *, recursive=False)
Renvoie un iterator qui produit les mêmes valeurs que glob(), sans toutes les
charger en mémoire simultanément.
glob.escape(pathname)
Échappe tous les caractères spéciaux ('?', '*' et '['). Cela est utile pour
reconnaître une chaîne de caractère littérale arbitraire qui contiendrait ce type de
caractères. Les caractères spéciaux dans les disques et répertoires partagés
(chemins UNC) ne sont pas échappés, e.g. sous
Windows escape('//?/c:/Quo vadis?.txt') renvoie '//?/c:/Quo vadis[?]
.txt'.
>>>
Si le répertoire contient des fichiers commençant par ., ils ne sont pas reconnus par
défaut. Par exemple, considérons un répertoire contenant card.gif et .card.gif :
>>>
Recherche de noms de fichiers de style shell (ne concerne pas les chemins)
Ce module fournit la gestion des caractères de remplacement de style shell Unix, qui
ne sont pas identiques à ceux utilisés dans les expressions régulières (documentés
dans le module re). Les caractères spéciaux utilisés comme caractères de
remplacement de style shell sont :
Motif Signification
* reconnaît n'importe quoi
? reconnaît n'importe quel caractère unique
[seq] reconnaît n'importe quel caractère dans seq
Pour une correspondance littérale, il faut entourer le métacaractère par des crochets.
Par exemple, '[?]' reconnaît le caractère '?'.
Notons que le séparateur de nom de fichiers ( '/' sous Unix) n'est pas traité de
manière spéciale par ce module. Voir le module glob pour la recherche de chemins
(glob utilise filter() pour reconnaître les composants d'un chemin). De la même
manière, les noms de fichiers commençant par un point ne sont pas traités de
manière spéciale par ce module, et sont reconnus par les motifs * et ?.
fnmatch.fnmatch(filename, pattern)
Cet exemple affiche tous les noms de fichiers du répertoire courant ayant pour
extension .txt :
import fnmatch
import os
fnmatch.filter(names, pattern)
fnmatch.translate(pattern)
Exemple :
linecache.getline(filename, lineno, module_globals=None)
linecache.clearcache()
Nettoie le cache. Utilisez cette fonction si vous n'avez plus besoin des lignes des
fichiers précédemment lus via getline().
linecache.checkcache(filename=None)
Vérifie la validité du cache. Utilisez cette fonction si les fichiers du cache pourraient
avoir changé sur le disque, et que vous en voudriez une version à jour.
Sans filename, toutes les entrées du cache seront vérifiées.
linecache.lazycache(filename, module_globals)
Exemple :
>>>
Avertissement
Même les fonctions de copie haut niveau ( shutil.copy(), shutil.copy2()) ne
peuvent copier toutes les métadonnées des fichiers.
Sur les plateformes POSIX, cela signifie que le propriétaire et le groupe du fichier
sont perdus, ainsi que les ACLs. Sur Mac OS, le clonage de ressource et autres
métadonnées ne sont pas utilisés. Cela signifie que les ressources seront perdues et
que le type de fichier et les codes créateur ne seront pas corrects. Sur Windows, les
propriétaires des fichiers, ACLs et flux de données alternatifs ne sont pas copiés.
shutil.copyfile(src, dst, *, follow_symlinks=True)
exception shutil.SameFileError
Cette exception est levée si la source et la destination dans copyfile() sont le
même fichier.
shutil.copymode(src, dst, *, follow_symlinks=True)
shutil.copystat(src, dst, *, follow_symlinks=True)
Copie les bits définissant les droits d'accès, la date du dernier accès, de la dernière
modification et les drapeaux (flags en anglais) de src vers dst. Sur
Linux, copystat() copie également, si possible, les "extended attributes". Le
contenu du fichier, le propriétaire et le groupe ne sont pas affectés. src et dst sont
des chaînes spécifiant les chemins.
Note
Toutes les plateformes n'offrent pas la possibilité d'examiner et modifier les liens
symboliques. Python peut vous informer des fonctionnalités effectivement
disponibles.
Si os.chmod in os.supports_follow_symlinks est True, copystat()
peut modifier les octets de droits d'accès du lien symbolique.
If os.utime in os.supports_follow_symlinks is True, copystat() ca
n modify the last access and modification times of a symbolic link.
If os.chflags in os.supports_follow_symlinks is True, copystat()
can modify the flags of a symbolic link. (os.chflags is not available on all
platforms.)
On platforms where some or all of this functionality is unavailable, when asked to
modify a symbolic link, copystat() will copy everything it can. copystat() never
returns failure.
shutil.copy(src, dst, *, follow_symlinks=True)
copy() copies the file data and the file's permission mode (see os.chmod()). Other
metadata, like the file's creation and modification times, is not preserved. To preserve
all file metadata from the original, use copy2() instead.
shutil.copy2(src, dst, *, follow_symlinks=True)
shutil.ignore_patterns(*patterns)
This factory function creates a function that can be used as a callable
for copytree()'s ignore argument, ignoring files and directories that match one of
the glob-style patterns provided. See the example below.
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignor
e_dangling_symlinks=False)
Recursively copy an entire directory tree rooted at src, returning the destination
directory. The destination directory, named by dst, must not already exist; it will be
created as well as missing parent directories. Permissions and times of directories
are copied with copystat(), individual files are copied using shutil.copy2().
If symlinks is true, symbolic links in the source tree are represented as symbolic links
in the new tree and the metadata of the original links will be copied as far as the
platform allows; if false or omitted, the contents and metadata of the linked files are
copied to the new tree.
When symlinks is false, if the file pointed by the symlink doesn't exist, an exception
will be added in the list of errors raised in an Error exception at the end of the copy
process. You can set the optional ignore_dangling_symlinks flag to true if you want to
silence this exception. Notice that this option has no effect on platforms that don't
support os.symlink().
If ignore is given, it must be a callable that will receive as its arguments the directory
being visited by copytree(), and a list of its contents, as returned
by os.listdir(). Since copytree() is called recursively, the ignore callable will
be called once for each directory that is copied. The callable must return a sequence
of directory and file names relative to the current directory (i.e. a subset of the items
in its second argument); these names will then be ignored in the copy
process. ignore_patterns() can be used to create such a callable that ignores
names based on glob-style patterns.
If copy_function is given, it must be a callable that will be used to copy each file. It
will be called with the source path and the destination path as arguments. By
default, shutil.copy2() is used, but any function that supports the same signature
(like shutil.copy()) can be used.
shutil.rmtree(path, ignore_errors=False, onerror=None)
Delete an entire directory tree; path must point to a directory (but not a symbolic link
to a directory). If ignore_errors is true, errors resulting from failed removals will be
ignored; if false or omitted, such errors are handled by calling a handler specified
by onerror or, if that is omitted, they raise an exception.
Note
On platforms that support the necessary fd-based functions a symlink attack resistant
version of rmtree() is used by default. On other platforms,
the rmtree() implementation is susceptible to a symlink attack: given proper timing
and circumstances, attackers can manipulate symlinks on the filesystem to delete
files they wouldn't be able to access otherwise. Applications can use
the rmtree.avoids_symlink_attacks function attribute to determine which case
applies.
The first parameter, function, is the function which raised the exception; it depends
on the platform and implementation. The second parameter, path, will be the path
name passed to function. The third parameter, excinfo, will be the exception
information returned by sys.exc_info(). Exceptions raised by onerror will not be
caught.
Modifié dans la version 3.3: Added a symlink attack resistant version that is used
automatically if platform supports fd-based functions.
rmtree.avoids_symlink_attacks
Indicates whether the current platform and implementation provides a symlink attack
resistant version of rmtree(). Currently this is only true for platforms supporting fd-
based directory access functions.
shutil.move(src, dst, copy_function=copy2)
Recursively move a file or directory (src) to another location (dst) and return the
destination.
If the destination is an existing directory, then src is moved inside that directory. If the
destination already exists but is not a directory, it may be overwritten depending
on os.rename() semantics.
Modifié dans la version 3.3: Added explicit symlink handling for foreign filesystems,
thus adapting it to the behavior of GNU's mv. Now returns dst.
shutil.disk_usage(path)
Return disk usage statistics about the given path as a named tuple with the
attributes total, used and free, which are the amount of total, used and free space, in
bytes. On Windows, path must be a directory; on Unix, it can be a file or directory.
shutil.chown(path, user=None, group=None)
user can be a system user name or a uid; the same applies to group. At least one
argument is required.
Disponibilité : Unix.
Nouveau dans la version 3.3.
shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)
Return the path to an executable which would be run if the given cmd was called. If
no cmd would be called, return None.
>>>
>>> shutil.which("python")
'C:\\Python33\\python.EXE'
exception shutil.Error
This exception collects exceptions that are raised during a multi-file operation.
For copytree(), the exception argument is a list of 3-tuples
(srcname, dstname, exception).
copytree example
This example is the implementation of the copytree() function, described above,
with the docstring omitted. It demonstrates many of the other functions provided by
this module.
This will copy everything except .pyc files and files or directories whose name starts
with tmp.
shutil.rmtree(directory, onerror=remove_readonly)
Archiving operations
Nouveau dans la version 3.2.
High-level utilities to create and read compressed and archived files are also
provided. They rely on the zipfile and tarfile modules.
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run
[, owner[, group[, logger]]]]]]])
Create an archive file (such as zip or tar) and return its name.
base_name is the name of the file to create, including the path, minus any format-
specific extension. format is the archive format: one of "zip" (if the zlib module is
available), "tar", "gztar" (if the zlib module is available), "bztar" (if the bz2 module is
available), or "xztar" (if the lzma module is available).
root_dir is a directory that will be the root directory of the archive, all paths in the
archive will be relative to it; for example, we typically chdir into root_dir before
creating the archive.
If dry_run is true, no archive is created, but the operations that would be executed
are logged to logger.
owner and group are used when creating a tar archive. By default, uses the current
owner and group.
shutil.get_archive_formats()
Return a list of supported formats for archiving. Each element of the returned
sequence is a tuple (name, description).
You can register new formats or provide your own archiver for any existing formats,
by using register_archive_format().
shutil.register_archive_format(name, function[, extra_args[, description
]])
Register an archiver for the format name.
function is the callable that will be used to unpack archives. The callable will receive
the base_name of the file to create, followed by the base_dir (which defaults
to os.curdir) to start archiving from. Further arguments are passed as keyword
arguments: owner, group, dry_run and logger (as passed in make_archive()).
shutil.unpack_archive(filename[, extract_dir[, format]])
extract_dir is the name of the target directory where the archive is unpacked. If not
provided, the current working directory is used.
format is the archive format: one of "zip", "tar", "gztar", "bztar", or "xztar". Or any
other format registered with register_unpack_format(). If not
provided, unpack_archive() will use the archive file name extension and see if an
unpacker was registered for that extension. In case none is found, a ValueError is
raised.
shutil.register_unpack_format(name, extensions, function[, extra_args[,
description]])
function is the callable that will be used to unpack archives. The callable will receive
the path of the archive, followed by the directory the archive must be extracted to.
shutil.unregister_unpack_format(name)
shutil.get_unpack_formats()
Return a list of all registered formats for unpacking. Each element of the returned
sequence is a tuple (name, extensions, description).
You can register new formats or provide your own unpacker for any existing formats,
by using register_unpack_format().
Archiving example
In this example, we create a gzip'ed tar-file archive containing all files found in
the .ssh directory of the user:
>>>
$ tree tmp
tmp
└── root
└── structure
├── content
└── please_add.txt
└── do_not_add.txt
>>>
If the terminal size cannot be successfully queried, either because the system doesn't
support querying, or because we are not connected to a terminal, the value given
in fallback parameter is used. fallback defaults to (80, 24) which is the default
size used by many terminal emulators.
The value returned is a named tuple of type os.terminal_size.
See also: The Single UNIX Specification, Version 2, Other Environment Variables.
La documentation :
Indices et tables :
Méta informations :
concurrent
cProfile
csv Write and read tabular data to and from delimited files.
encodings
posix (Unix) The most common POSIX system calls (normally used via
module os).
S
U
urllib
xmlrpc
z
zipapp Manage executable Python zip archives