D. Glosario

>>>
El indicador típico de la interfaz interactiva de Python. Suele indicar código de ejemplo que se puede probar directamente en el intérprete.

...
El indicador típico de la interfaz interactiva de Python al introducir código de un bloque sangrado.

ámbitos anidados
La capacidad de referirse a una variable de una definición que envuelve a la actual. Por ejemplo, una función definida dentro de otra función puede referirse a las variables de la función más externa. Es importante recordar que los ámbitos anidados sólo funcionan en referencia y no en asignación, que siempre escribirá sobre la función externa. Por contra, las variables locales se escriben y leen en el ámbito más interno. Igualmente, las variables globales se leen y escriben en el espacio nominal global.

BDFL
Dictador bienintencionado vitalicio (Benevolent Dictator For Life), alias Guido van Rossum, el creador de Python.

byte code
La representación interna de un programa Python en el intérprete. El bytecode también se almacena en modo caché en los ficheros .pyc y .pyo para que sea más rápido ejecutar el mismo fichero la segunda vez (la compilación a bytecode vale de una vez a otra). Se dice que este ``lenguaje intermedio'' se ejecuta sobre una ``máquina virtual'' que llama a las subrutinas correspondientes a cada código del bytecode.

clase tradicional
Cualquier clase que no herede de object. Ver clase moderna.

clase moderna
Cualquier clase que herede de object. Esto incluye todos los tipos internos como list y dict. Sólo las clases modernas pueden utilizar las características más novedosas y versátiles de Python, como los __slots__, descriptores, propiedades, __getattribute__(), métodos de clase y métodos estáticos.

coerción

La conversión implícita de una instancia de un tipo a otro durante una operación que involucra dos argumentos del mismo tipo. Por ejemplo, int(3.15) convierte el número de coma flotante al entero 3, pero en 3+4.5, cada argumento es de un tipo diferente (un entero y un flotante) y hay que convertir los dos en el mismo tipo antes de que puedan ser sumados o se lanzará un TypeError. La coerción entre dos operandos se puede realizar con la función interna coerce; por ello, 3+4.5 equivale a operator.add(*coerce(3, 4.5)) y devuelve operator.add(3.0, 4.5). Sin coerción, todos los argumentos, incluso de tipos compatibles, habrían de ser normalizados al mismo tipo por el programador, es decir, float(3)+4.5 en lugar de simplemente 3+4.5.

correspondencia
Un objeto contenedor (como dict) que permite búsquedas de claves arbitrarias utilizando el método especial __getitem__().

descriptor
Cualquier objeto moderno que defina los métodos __get__(), __set__() o __delete__(). Cuando un atributo de clase es un descriptor, se dispara su comportamiento de enlace especial para cualquier búsqueda de atributos. Normalmente, escribir a.b busca el objeto b en el diccionario de la clase de a, pero si b es un descriptor, se llama al método definido. La comprensión de los descriptores es clave para una comprensión profunda de Python, porque son la base de muchas características, incluyendo funciones, métodos, propiedades, métodos de clase, métodos estáticos y referencia a súper clases.

diccionario
Un vector asociativo, donde claves arbitrarias se hacen corresponder a valores. El uso de dict se parece en mucho al de list, pero las claves pueden ser cualquier objeto con una función __hash__(), no se limitan a enteros partiendo de cero. En Perl se llama hash.

División entera
La división matemática que descarta el resto. Por ejemplo, la expresión 11/4 se evalúa en la actualidad a 2 a diferencia del valor 2.75 que devuelve la división de coma flotante. Cuando se dividen dos enteros el resultado siempre será otro entero (se aplicará la función truncar al resultado). Sin embargo, si uno de los operandos es de otro tipo numérico (por ejemplo, un float), el resultado se adaptará (ver coerción) a un tipo común. Por ejemplo, un entero dividido por un flotante dará un valor flotante, posiblemente con una fracción decimal. Se puede forzar la división entera utilizando el operador // en lugar del operador /. Ver también __future__.

duck-typing
El estilo de programación de Python que determina el tipo de un objeto mediante la inspección de la signatura de sus métodos y atributos más que por una relación explícita a algún objeto tipo (``Si parece un pato y grazna como un pato, debe de ser un pato''). Haciendo énfasis en las interfaces más que en tipos específicos, el código bien diseñado mejora su flexibilidad permitiendo la sustitución polimórfica. El tipado del pato intenta evitar las comprobaciones con type() o isinstance(). En su lugar, suele emplear pruebas con hasattr() o programación EAFP.

EAFP
Siglas en inglés de ``Mejor pedir perdón que permiso''. Este estilo de programación, común en Python, asume la existencia de claves o atributos válidos y captura las excepciones que se producen si tal suposición se revela falsa. Este estilo limpio y rápido se caracteriza por la existencia de muchas sentencias try y except. Esta técnica contrasta con el estilo LBYL, común en muchos otros lenguajes, como C.

espacio nominal
El lugar donde se almacena una variable. Los espacios nominales se implementan como diccionarios. Hay espacios nominales locales, globales e internos, además de los espacios nominales anidados de los objetos (sus métodos). Los espacios nominales posibilitan la modularidad al prevenir los conflictos entre nombres. Por ejemplo, las funciones __builtin__.open() y os.open() se distinguen entre sí por sus espacios nominales. Los espacios nominales también mejoran la legibilidad y la mantenibilidad dejando claro qué módulos implementan una función. Por ejemplo, escribir random.seed() o itertools.izip() deja claro qué funciones se implementan en el módulo random o en el módulo itertools, respectivamente.

expresión generadora
Una expresión que devuelve un generador. Parece una expresión normal seguida por una expresión for que define una variable de bucle, rango y una expresión opcional if. La expresión combinada genera valores para una función que la contenga:

>>> sum(i*i for i in range(10)) # la suma de los cuadrados 0, 1, 4..81
285

__future__
Un pseudo-módulo que pueden usar los programadores para activar características nuevas del lenguaje incompatibles con el intérprete actual. Por ejemplo, la expresión 11/4 actualmente se evalúa como 2. Si el módulo en que se ejecuta ha activado la división fiel ejecutando:

from __future__ import division

la expresión 11/4 se evaluaría como 2.75. Si se importa el módulo __future__ propiamente dicho y se evalúan sus variables, se puede ver cuándo se añadió una nueva característica y cuando será activa de manera predeterminada:

>>> import __future__
>>> __future__.division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)

generador
Una función que devuelve un iterador. Parece una función normal, salvo que los valores se devuelven al llamante utilizando una sentencia yield en lugar de una sentencia return. Las funciones generadoras suelen contener uno o más bucles for o while que devuelven (yield) elementos al llamante. La ejecución de la función se para en la palabra clave yield (devolviendo el resultado) y se reanuda cuando se solicita el siguiente elemento llamando al método next() del iterador devuelto.

GIL
Ver bloqueo global del intérprete.

bloqueo global del intérprete

El bloqueo que utilizan los hilos de Python para asegurar que sólo se ejecute un hilo a la vez. Esto simplifica Python asegurando que dos procesos no acceden a la memoria simultáneamente. Bloquear el intérprete entero facilita al intérprete ser multihilo, a costa de perder paralelismo en máquinas multiprocesador. Se han realizado esfuerzos para crear un intérprete de ``hilos libres'' (uno que bloquee los datos con un nivel más fino), pero el rendimiento se resentía en el caso habitual de un solo procesador.

IDLE
Un Entorno de Desarrollo Integrado para Python. IDLE es un entorno básico de editor e intérprete que se incluye en la distribución estándar de Python. Es adecuado para novatos y sirve de código de ejemplo claro para los que busquen implementar una aplicación con interfaz de usuario gráfica multiplataforma y de complejidad mediana.

inmutable
Un objeto con valor fijo. Los objetos inmutables incluyen los números, las cadenas y las tuplas. Un objeto inmutable no puede ser alterado. Si se desea un valor diferente es necesario crear un nuevo objeto. Cumplen un papel importante en los sitios donde se necesita un valor hash constante, como en las claves de un diccionario.

interactivo
Python cuenta con un intérprete interactivo, lo que significa que se pueden probar cosas y ver de inmediato los resultados. Basta con lanzar python sin argumentos (o seleccionarlo desde el menú principal del ordenador). Es un medio muy potente de experimentar o inspeccionar módulos y paquetes (recuerda help(x)).

interpretado
Python es un lenguaje interpretado, a diferencia de uno compilado. Esto significa que los archivos de fuentes se pueden ejecutar directamente sin tener que crear un ejecutable. Los lenguajes interpretados suelen tener un ciclo de desarrollo/depuración más rápido, aunque sus programas también suelen más lentos en ejecución. Ver también interactive.

iterable
Un objeto contenedor capaz de devolver sus miembros de uno en uno. Ejemplos de iterables incluyen todos los tipos secuencia (como list, str y tuple) y algunos otros, como dict y file o cualquier objeto que se defina con un método __iter__() o __getitem__(). Los iterables se pueden usar en un bucle for y en muchos otros lugares donde se necesite una secuencia (zip(), map()...). Cuando se pasa un objeto iterable como argumento de la función interna iter(), devuelve un iterador para el objeto. Este iterador es válido para un recorrido por el conjunto de valores. Al usar iterables, no suele ser necesario llamar a iter() o gestionar los objetos iteradores explícitamente. La sentencia for lo hace automáticamente, creando una variable temporal anónima para guardar el iterador durante la ejecución del bucle. Ver también iterador, secuencia y generador.

iterador
Un objeto que representa un flujo de datos. Las sucesivas llamadas al método next() del iterador devuelven elementos sucesivos del flujo. Cuando no quedan más datos, se lanza una excepción StopIteration en lugar de devolver más datos. En este punto, el objeto iterador está agotado y cualquier llamada a su método next() se limitará a lanzar de nuevo StopIteration. Se exige que los iteradores devuelvan un método __iter__() que devuelva el propio objeto iterador para que cada iterador sea a su vez iterable y pueda ser utilizado en la mayoría de los casos en que se puedan utilizar otros iterables. Una importante excepción es el código que intenta varias pasadas por la iteración. Un objeto contenedor (como una list) genera un iterador nuevecito cada vez que se le pasa a la función iter() o se usa en un bucle for. Si se intenta esto con un iterador, se reutilizará el mismo objeto iterador agotado que se usó en la iteración anterior, haciendo que parezca vacío.

LBYL
Look before you leap (mira antes de saltar). Este estilo de codificar verifica explicitamente las condiciones previas antes de hace llamadas o búsquedas. Este estilo contrasta con el EAFP y se caracteriza por la abundancia de sentencias if.

lista autodefinida
Una manera compacta de procesar todos o parte de los elementos de una secuencia y devolver una lista con los resultados. resultado = ["0x%02x" % x for x in range(256) if x % 2 == 0] genera una lista de cadenas que contienen los números hexadecimales (0x...) pares del rango 0..255. La cláusula if es opcional. Si se hubiese omitido, se habrían procesado todos los elementos de range(256).

metaclase
La clase de las clases. Las definiciones de clases generan un nombre de clase, un diccionario de la clase y una lista de clases base. La metaclase es responsable de tomar estos tres argumentos y crear la clase. La mayoría de los lenguajes de programación orientados a objetos proporcionan una implementación predeterminada. Lo que hace especial a Python en que es posible crear metaclases a medida. La mayoría de los usuarios nunca hacen uso de esta herramienta, pero si surge la necesidad, las metaclases permiten soluciones potentes y elegantes. Se han utilizado para registrar los accesos a atributos, añadir seguridad multihilo, trazar la creación de objetos, implementar el patrón singleton y muchas otras tareas.

mutable
Los objetos mutables pueden cambiar su valor pero mantener su id(). Ver también inmutable.

número complejo

Una extensión del habitual sistema de números reales en el que todos los números se expresan como una suma de una parte real y una imaginaria. Los números imaginarios son múltiplos reales de la unidad imaginaria (la raíz cuadrada de -1), que se escribe i en matemáticas o j en ingeniería. Python tiene soporte de serie para números complejos, que se escriben en la segunda notación; la parte imaginaria se escribe con un sufijo j, por ejemplo, 3+1j. Para acceder a los equivalentes complejos del módulo math, usa cmath. El uso de números complejos es una técnica relativamente avanzada. Si no sabes si los necesitas, es casi seguro que puedes hacerles caso omiso con tranquilidad.

Python3000
Una versión mítica de Python, a la que se permitiría no ser compatible hacia atrás, con interfaz telepática.

__slots__
Una declaración dentro de una clase moderna que ahorra memoria al declarar el espacio para guardar los atributos de las instancias y eliminar los diccionarios de instancia. A pesar de ser popular, la técnica es enrevesada de aplicar correctamente y se reserva para los casos infrecuentes en que hay una gran cantidad de instancias de un objeto en una aplicación crítica en memoria.

secuencia
Un iterable a cuyos elementos se puede acceder de manera eficiente mediante índices enteros, a través de los métodos especiales __getitem__() y __len__(). Ejemplos de tipos secuencia internos son list, str, tuple y unicode. Hay que destacar que dict también permite __getitem__() y __len__(), pero se considera una correspondencia más que una secuencia porque las búsquedas se realizan con claves arbitrarias inmutables en lugar de enteros.

Zen de Python
Enumeración de los principios de diseño y la filosofía de Python útiles para comprender y utilizar el lenguaje. Esta lista se puede obtener tecleando ``import this'' en el intérprete interactivo.

Consultar en Acerca de este documento... información para sugerir cambios.