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 ☺).

It is dangerous to add too many implementation details to a language reference document — the implementation may change, and other implementations of the same language may work differently. On the other hand, there is currently only one Python implementation in widespread use (although alternate implementations exist), and its particular quirks are sometimes worth being mentioned, especially where the implementation imposes additional limitations. Therefore, you’ll find short « implementation notes » sprinkled throughout the text.

Chaque implémentation de Python est livrée avec un certain nombre de modules natifs. Ceux-ci sont documentés dans La bibliothèque standard. Quelques modules natifs sont mentionnés quand ils interagissent significativement avec la définition du langage.

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.

Parmi les implémentations les plus connues, nous pouvons citer :

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).

Python pour .NET

Cette implémentation utilise en fait l’implémentation CPython, mais c’est une application .NET et permet un accès aux bibliothèques .NET. Elle a été créée par Brian Lloyd. Pour plus d’informations, consultez la page d’accueil Python pour .NET (site en anglais).

IronPython

Un autre Python pour .NET. Contrairement à Python.NET, il s’agit d’une implémentation Python complète qui génère du code intermédiaire (IL) .NET et compile le code Python directement en assemblages .NET. Il a été créé par Jim Hugunin, le programmeur à l’origine de Jython. Pour plus d’informations, voir the IronPython website (site en anglais).

PyPy

Une implémentation de Python complètement écrite en Python. Elle apporte des fonctionnalités avancées introuvables dans d’autres implémentations, telles que le fonctionnement sans pile (stackless en anglais) et un compilateur à la volée (Just in Time compiler en anglais). L’un des objectifs du projet est d’encourager l’expérimentation du langage lui-même en facilitant la modification de l’interpréteur (puisqu’il est écrit en Python). Des informations complémentaires sont disponibles sur la page d’accueil du projet PyPy (site en anglais).

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 :

name      ::=  lc_letter (lc_letter | "_")*
lc_letter ::=  "a"..."z"

La première ligne indique qu’un name est un lc_letter suivi d’une suite de zéro ou plus lc_letters ou tiret bas. Un lc_letter est, à son tour, l’un des caractères 'a' à 'z' (cette règle est effectivement respectée pour les noms définis dans les règles lexicales et grammaticales de ce document).

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.