¿Para qué se usa __future__ en Python y cómo/cuándo usarlo y cómo funciona?

Resuelto leslie asked hace 13 años • 9 respuestas

__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.

leslie avatar Aug 16 '11 14:08 leslie
Aceptado

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_statementen 2.5, ya que la withpalabra clave era nueva y ya no debería usarse como nombres de variables. Para utilizarla withcomo 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 printdeclaraciones 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: printse 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>
>>>
glglgl avatar Aug 16 '2011 07:08 glglgl

Cuando tu lo hagas

from __future__ import whatever

En realidad, no estás utilizando una importdeclaració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.

agf avatar Aug 16 '2011 08:08 agf

__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/4actualmente 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/4se 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)
CodeArtist avatar Feb 20 '2013 20:02 CodeArtist

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_scopesdirectiva 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 divisiondirectiva obliga al uso de la división de estilos de Python 3.0.

absolute_import

Permite que entre paréntesis se incluyan varias importdeclaraciones. 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 withcomo palabra clave en Python para eliminar la necesidad de try/finallydeclaraciones. 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 MESSAGEdeclaración de estilo.

unicode_literals

Introduce la sintaxis literal del bytesobjeto. Lo que significa que declaraciones como bytes('Hello world', 'ascii')pueden expresarse simplemente como b'Hello world'.

generator_stop

Reemplaza el uso de la StopIterationexcepción utilizada dentro de las funciones del generador con la RuntimeErrorexcepció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/
Rob Grossman avatar Mar 11 '2018 17:03 Rob Grossman

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 printcomo función:

>>> print('# of entries', len(dictionary), file=sys.stderr)
Mihai Maruseac avatar Aug 16 '2011 08:08 Mihai Maruseac