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