# `__future__` — Definiciones de declaraciones futuras

Código fuente: Lib/__future__.py

`__future__` es un módulo real y tiene tres propósitos:

- Para evitar confundir las herramientas existentes que analizan las declaraciones de importación y esperan encontrar los módulos que están importando.

- Para garantizar que las declaraciones futuras se ejecuten en versiones anteriores a 2.1 al menos produzcan excepciones en tiempo de ejecución (la importación de `__future__` fallará, porque no había ningún módulo con ese nombre antes de 2.1).

- Documentar cuándo se introdujeron cambios incompatibles y cuándo serán — o fueron — obligatorios. Esta es una forma de documentación ejecutable y se puede inspeccionar mediante programación importando `__future__` y examinando su contenido.

Cada declaración en `__future__.py` tiene la forma:

    FeatureName = _Feature(OptionalRelease, MandatoryRelease,
                           CompilerFlag)

donde, normalmente, OptionalRelease es menor que MandatoryRelease y ambos son 5-tuplas de la misma forma que `sys.version_info`:

    (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
     PY_MINOR_VERSION, # the 1; an int
     PY_MICRO_VERSION, # the 0; an int
     PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
     PY_RELEASE_SERIAL # the 3; an int
    )

OptionalRelease registra la primera versión en la que se aceptó la característica.

En el caso de un MandatoryRelease que aún no se ha producido, MandatoryRelease predice el lanzamiento en el que la característica pasará a formar parte del lenguaje.

De otro modo, MandatoryRelease registra cuándo la característica se convirtió en parte del lenguaje; en versiones en o después de este, los módulos ya no necesitan una declaración futura para usar la característica en cuestión, pero pueden continuar usando dichas importaciones.

MandatoryRelease también puede ser `None`, lo que significa que se eliminó una característica planificada.

Las instancias de la clase `_Feature` tienen dos métodos correspondientes, `getOptionalRelease()` y `getMandatoryRelease()`.

CompilerFlag es el indicador (campo de bits) que debe pasarse en el cuarto argumento a la función incorporada `compile()` para habilitar la característica en código compilado dinámicamente. Esta bandera se almacena en el atributo `compiler_flag` en las instancias `_Feature`.

Ninguna descripción de característica se eliminará de `__future__`. Desde su introducción en Python 2.1, las siguientes características han encontrado su camino en el lenguaje usando este mecanismo:

característica | opcional en | obligatorio en | efecto
--- | --- | --- | ---
nested_scopes | 2.1.0b1 | 2.2 | PEP 227: Ámbitos anidados estáticamente
generadores | 2.2.0a1 | 2.3 | PEP 255: Generadores simples
división | 2.2.0a2 | 3.0 | PEP 238: Cambio de operador de división
absolute_import | 2.5.0a1 | 3.0 | PEP 328: Importaciones: Multilínea y Absoluto/Relativo
with_statement | 2.5.0a1 | 2.6 | PEP 343: La declaración «with»
print_function | 2.6.0a2 | 3.0 | PEP 3105: Hacer de print una función
unicode_literals | 2.6.0a2 | 3.0 | PEP 3112: Bytes literales en Python 3000
generator_stop | 3.5.0b1 | 3.7 | PEP 479: Manejo de StopIteration dentro de generadores
anotaciones | 3.7.0b1 | 3.10 | PEP 563: Evaluación pospuesta de anotaciones

Ver también

Future statements

  Cómo trata el compilador las importaciones futuras.