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

S’agissant du manuel de référence d’un langage, il est dangereux de rentrer profondément dans les détails d’implémentation ; l’implémentation peut changer et d’autres implémentations du même langage peuvent fonctionner différemment. En même temps, CPython est l’implémentation de Python la plus répandue (bien que d’autres implémentations gagnent en popularité) et certaines de ses bizarreries méritent parfois d’être mentionnées, en particulier lorsque l’implémentation impose des limitations supplémentaires. Par conséquent, vous trouvez de courtes "notes d’implémentation" saupoudrées dans le texte.

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 implemented in Java. This implementation can be used as a scripting language for Java applications, or can be used to create applications using the Java class libraries. It is also often used to create tests for Java libraries. More information can be found at the Jython website.

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

  An alternate Python for .NET. Unlike Python.NET, this is a complete Python implementation that generates IL, and compiles Python code directly to .NET assemblies. It was created by Jim Hugunin, the original creator of Jython. For more information, see the IronPython website.

PyPy

  An implementation of Python written completely in Python. It supports several advanced features not found in other implementations like stackless support and a Just in Time compiler. One of the goals of the project is to encourage experimentation with the language itself by making it easier to modify the interpreter (since it is written in Python). Additional information is available on the PyPy project's home page.

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_letter`s 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.