¿Para qué se usa __future__ en Python y cómo/cuándo usarlo y cómo funciona?
__future__
Aparece con frecuencia en los módulos de Python. No entiendo para qué __future__
sirve y cómo/cuándo usarlo incluso después de leer el documento de Python__future__
.
¿Alguien puede explicarlo con ejemplos?
Algunas respuestas sobre el uso básico de __future__
lo que recibí me parecieron correctas.
Sin embargo, necesito entender una cosa más sobre cómo __future__
funciona:
El concepto más confuso para mí es cómo una versión actual de Python incluye funciones para versiones futuras y cómo un programa que utiliza una función de una versión futura se puede compilar con éxito en la versión actual de Python.
Supongo que la versión actual incluye funciones potenciales para el futuro. Sin embargo, las funciones solo están disponibles mediante el uso __future__
porque no son el estándar actual. Déjame saber si tengo razón.
Con __future__
la inclusión del módulo, poco a poco podrá acostumbrarse a cambios incompatibles o a cambios que introducen nuevas palabras clave.
Por ejemplo, para usar administradores de contexto, tenía que hacerlo from __future__ import with_statement
en 2.5, ya que la with
palabra clave era nueva y ya no debería usarse como nombres de variables. Para utilizarla with
como palabra clave de Python en Python 2.5 o anterior, deberá utilizar la importación desde arriba.
Otro ejemplo es
from __future__ import division
print 8/7 # prints 1.1428571428571428
print 8//7 # prints 1
Sin el __future__
material, ambas print
declaraciones se imprimirían 1
.
La diferencia interna es que sin esa importación, /
se asigna al __div__()
método, mientras que con él, __truediv__()
se utiliza. (En cualquier caso, //
llama __floordiv__()
.)
A propósito print
: print
se convierte en una función en 3.x, perdiendo su propiedad especial como palabra clave. Entonces es al revés.
>>> print
>>> from __future__ import print_function
>>> print
<built-in function print>
>>>
Cuando tu lo hagas
from __future__ import whatever
En realidad, no estás utilizando una import
declaración, sino una declaración futura . Estás leyendo los documentos equivocados, ya que en realidad no estás importando ese módulo.
Las declaraciones futuras son especiales: cambian la forma en que se analiza su módulo Python, por lo que deben estar en la parte superior del archivo. Dan un significado nuevo (o diferente) a las palabras o símbolos de su archivo. De los documentos:
Una declaración futura es una directiva para el compilador de que un módulo en particular debe compilarse utilizando la sintaxis o semántica que estará disponible en una versión futura específica de Python. La futura declaración tiene como objetivo facilitar la migración a futuras versiones de Python que introduzcan cambios incompatibles en el lenguaje. Permite el uso de las nuevas funciones por módulo antes del lanzamiento en el que la función se convierte en estándar.
Si realmente desea importar el __future__
módulo, simplemente haga
import __future__
y luego acceda a él como de costumbre.
__future__
es un pseudomódulo que los programadores pueden utilizar para habilitar nuevas funciones del lenguaje que no son compatibles con el intérprete actual . Por ejemplo, la expresión 11/4
actualmente se evalúa como 2
. Si el módulo en el que se ejecuta hubiera habilitado la verdadera división ejecutando:
from __future__ import division
la expresión 11/4
se evaluaría como 2.75
. Al importar el __future__
módulo y evaluar sus variables, puede ver cuándo se agregó por primera vez una nueva característica al idioma y cuándo se convertirá en la predeterminada:
>>> import __future__
>>> __future__.division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
Ya hay algunas respuestas excelentes, pero ninguna aborda una lista completa de lo que __future__
respalda actualmente la declaración.
En pocas palabras, la __future__
declaración obliga a los intérpretes de Python a utilizar funciones más nuevas del lenguaje.
Las características que soporta actualmente son las siguientes:
nested_scopes
Antes de Python 2.1, el siguiente código generaba un NameError :
def f():
...
def g(value):
...
return g(value-1) + 1
...
La from __future__ import nested_scopes
directiva permitirá habilitar esta característica.
generators
Se introdujeron funciones generadoras como la siguiente para guardar el estado entre llamadas de función sucesivas:
def fib():
a, b = 0, 1
while 1:
yield b
a, b = b, a+b
division
La división clásica se utiliza en las versiones de Python 2.x. Lo que significa que algunas declaraciones de división devuelven una aproximación razonable de la división ("división verdadera") y otras devuelven el piso ("división del piso"). A partir de Python 3.0, la división verdadera se especifica mediante x/y
, mientras que la división de piso se especifica mediante x//y
.
La from __future__ import division
directiva obliga al uso de la división de estilos de Python 3.0.
absolute_import
Permite que entre paréntesis se incluyan varias import
declaraciones. Por ejemplo:
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
LEFT, DISABLED, NORMAL, RIDGE, END)
En lugar de:
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
LEFT, DISABLED, NORMAL, RIDGE, END
O:
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END
with_statement
Agrega la declaración with
como palabra clave en Python para eliminar la necesidad de try/finally
declaraciones. Los usos comunes de esto son al realizar E/S de archivos, como por ejemplo:
with open('workfile', 'r') as f:
read_data = f.read()
print_function
:
Fuerza el uso de print()
la llamada a función de estilo paréntesis de Python 3 en lugar de la print MESSAGE
declaración de estilo.
unicode_literals
Introduce la sintaxis literal del bytes
objeto. Lo que significa que declaraciones como bytes('Hello world', 'ascii')
pueden expresarse simplemente como b'Hello world'
.
generator_stop
Reemplaza el uso de la StopIteration
excepción utilizada dentro de las funciones del generador con la RuntimeError
excepción.
Otro uso no mencionado anteriormente es que la __future__
declaración también requiere el uso de intérpretes Python 2.1+, ya que el uso de una versión anterior generará una excepción de tiempo de ejecución.
Referencias
- https://docs.python.org/2/library/future.html _ _
- https://docs.python.org/3/library/future.html _ _
- https://docs.python.org/2.2/whatsnew/node9.html
- https://www.python.org/dev/peps/pep-0255/
- https://www.python.org/dev/peps/pep-0238/
- https://www.python.org/dev/peps/pep-0328/
- https://www.python.org/dev/peps/pep-3112/
- https://www.python.org/dev/peps/pep-0479/
Se puede utilizar para utilizar funciones que aparecerán en versiones más recientes mientras se tiene una versión anterior de Python.
Por ejemplo
>>> from __future__ import print_function
te permitirá utilizar print
como función:
>>> print('# of entries', len(dictionary), file=sys.stderr)