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, prefiero usar español en lugar de especificaciones formales para todo excepto para la sintaxis y el análisis léxico. Ésto debería hacer el documento más comprensible para el lector promedio, pero deja espacio para ambigüedades. De esta manera, si vinieras de Marte e intentases implementar Python utilizando únicamente este documento, tendrías que deducir cosas y, de hecho, probablemente acabarías implementando un lenguaje diferente. Por otro lado, si estás usando Python y te preguntas cuáles son las reglas concretas acerca de un área específica del lenguaje, definitivamente las encontrarás aquí. Si te gustaría ver una definición más formal del lenguaje, tal vez podrías dedicar, voluntariamente, algo de tu tiempo… O inventar una máquina de clonar :-).
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 se puede usar como lenguaje de scripting para aplicaciones Java o se puede usar para crear aplicaciones usando las librerías de clases de Java. A menudo se usa para crear pruebas para librerías de Java. Se puede hallar más información en el sitio web de Jython.
- Python for .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
Un Python alternativo para .NET. Al contrario que Python.NET, esta es una implementación completa de Python que genera lenguaje intermedio (IL) y compila el código directamente en ensamblados de .NET. Ha sido creado por Jim Hugunin, el creador original de Jython. Para más información ver 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 el soporte stackless y un compilador Just in Time. Una de las metas del proyecto es animar a la experimentación con el lenguaje mismo haciendo más fácil la modificación del intérprete (ya que está escrito en Python). Hay información adicional disponible en el sitio web del proyecto PyPy.
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. 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 en el ejemplo anterior), se utilizan dos convenciones más: dos caracteres literales separados por tres puntos significan la elección de cualquier carácter individual en el rango (inclusivo) de caracteres ASCII dado. Una frase entre paréntesis angulares (<...>
) da una definición informal del símbolo definido; por ejemplo, ésto se puede usar, si fuera necesario, para describir la noción de “carácter de control”.
Aunque la notación usada 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 en los caracteres individuales de la fuente de entrada mientras que una definición sintáctica opera en el flujo de tokens generados por el análisis léxico. Todos los usos de BNF en el siguiente capítulo («Análisis Léxico») son definiciones léxicas. Usos en capítulos posteriores son definiciones sintácticas.