1. Introducción
***************

Este manual de referencia describe el lenguaje de programación Python.
No pretende ser un tutorial.

Aunque intento ser lo más preciso posible, he optado por utilizar el
Español (N. de T.: del original en inglés "I chose to use English")"
en lugar de especificaciones formales para todo, excepto para la
sintaxis y el análisis léxico. Esto debería hacer el documento más
comprensible para el lector medio, pero dejará espacio para
ambigüedades. En consecuencia, si vienes de Marte y tratas de re
implementar Python sólo a partir de este documento, puede que tengas
que adivinar cosas y, de hecho, probablemente acabarías implementando
un lenguaje bastante diferente. Por otro lado, si estás usando Python
y te preguntas cuáles son las reglas precisas sobre un área particular
del lenguaje, deberías poder encontrarlas aquí. Si te gustaría ver una
definición más formal del lenguaje, quizás podrías ofrecer tu tiempo
--- o inventar una máquina clonadora :-).

Es peligroso añadir muchos detalles de implementación en un documento
de referencia: la implementación puede cambiar y otras
implementaciones del lenguaje pueden funcionar de forma diferente. Por
otro lado, CPython es la implementación de Python más usada (aunque
implementaciones alternativas están ganando soporte), y es importante
mencionar sus detalles particulares especialmente donde la
implementación  impone limitaciones adicionales. Por lo tanto,
encontrarás pequeñas "notas sobre la implementación" repartidas por
todo el texto.

Cada implementación de Python viene con un número de módulos estándar
incorporados. Éstos están documentados en La biblioteca estándar de
Python. Unos pocos de estos módulos son citados cuando interactúan de
forma significativa con la definición del lenguaje.


1.1. Implementaciones alternativas
==================================

Aunque hay una implementación de Python que es, de lejos, la más
popular, hay otras implementaciones alternativas que pueden ser de
particular interés para diferentes audiencias.

Las implementaciones conocidas incluyen:

CPython
   Es la implementación original, y la más mantenida, de Python y está
   escrita en C. Las nuevas características del lenguaje normalmente
   aparecen primero aquí.

Jython
   Python implementado en Java. Esta implementación puede utilizarse
   como lenguaje de scripting para aplicaciones Java, o puede
   utilizarse para crear aplicaciones utilizando las bibliotecas de
   clases Java.  También se utiliza a menudo para crear pruebas para
   bibliotecas Java. Puede encontrar más información en the Jython
   website.

Python para .NET
   Esta implementación, de hecho, usa la implementación CPython, pero
   es una aplicación .NET gestionada y usa librerías .NET. Ha sido
   creada por Brian Lloyd. Para más información ir al sitio web de
   Python for .NET.

IronPython
   Una alternativa de Python para .NET.  A diferencia de Python.NET,
   esta es una implementación completa de Python que genera IL, y
   compila código Python directamente a ensamblados .NET.  Fue creado
   por Jim Hugunin, el creador original de Jython. Para más
   información, consulte el sitio web de IronPython.

PyPy
   Una implementación de Python escrita completamente en Python.
   Soporta varias características avanzadas que no se encuentran en
   otras implementaciones como compatibilidad stackless y un
   compilador Just in Time. Uno de los objetivos del proyecto es
   fomentar la experimentación con el propio lenguaje facilitando la
   modificación del intérprete (ya que está escrito en Python). Puede
   encontrar más información en la página principal del proyecto 'PyPy
   <https://www.pypy.org/>_'.

Cada una de estas implementaciones varía de una forma u otra del
lenguaje tal y como está documentado en este manual, o introduce
información específica más allá de lo cubierto por la documentación
estándar de Python. Por favor, consulte la documentación específica de
cada implementación para saber qué tienes que saber acerca de la
implementación específica que uses.


1.2. Notación
=============

Las descripciones del análisis léxico y sintáctico usan una notación
gramatical BNF modificada Backus–Naur form (BNF). De tal forma,
utilizan el siguiente estilo de definición:

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

La primera línea dice que un "name" es una "lc_letter" seguida de una
secuencia de cero o más "lc_letter"s y guiones bajos. Una "lc_letter"
es, a su vez, cualquiera de los caracteres de la "'a'" a la "'z'".
(Esta regla se cumple realmente para los nombres definidos en las
reglas léxicas y gramaticales en este documento.)

Cada regla empieza con un nombre (que es el nombre definido por la
regla) y "::=". Una barra vertical ("|") se usa para separar
alternativas; es el operador menos vinculante en esta notación. Un
asterisco ("*") significa cero o más repeticiones del elemento
anterior; del mismo modo, un signo más ("+") significa una o más
repeticiones, y una frase entre corchetes ("[]") significa cero o una
ocurrencia (en otras palabras, la frase adjunta es opcional). Los
operadores "*" y "+" se vinculan lo más firmemente posible; los
paréntesis se usan para agrupar. Las cadenas de caracteres literales
están entre comillas. El espacio en blanco sólo es útil para separar
tokens. Las reglas normalmente están contenidas en una sola línea; las
reglas con varias alternativas se pueden formatear, de forma
alternativa, con una barra vertical con cada línea después del primer
comienzo.

En las definiciones léxicas (como el ejemplo anterior), se utilizan
dos convenciones más: Dos caracteres literales separados por tres
puntos significan que se puede elegir cualquier carácter de la gama
dada (inclusiva) de caracteres ASCII. Una frase entre corchetes
angulares ("<...>") ofrece una descripción informal del símbolo
definido; por ejemplo, podría utilizarse para describir la noción de
"carácter de control" si fuera necesario.

Aunque la notación utilizada es casi la misma, hay una gran diferencia
entre el significado de las definiciones léxicas y sintácticas: una
definición léxica opera sobre los caracteres individuales de la fuente
de entrada, mientras que una definición sintáctica opera sobre el
flujo de tokens generado por el análisis léxico. Todos los usos de BNF
en el próximo capítulo ("Análisis léxico") son definiciones léxicas;
los usos en los capítulos siguientes son definiciones sintácticas.
