__future__
aparece frecuentemente en los módulos de Python. No entiendo para qué __future__
sirve y cómo / cuándo usarlo incluso después de leer el __future__
documento de Python .
¿Alguien puede explicar con ejemplos?
Algunas respuestas sobre el uso básico __future__
que he recibido 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 características para futuras versiones, y cómo un programa que usa una característica de una versión futura se puede compilar con éxito en la versión actual de Python.
Supongo que la versión actual incluye características potenciales para el futuro. Sin embargo, las funciones están disponibles solo mediante el uso __future__
porque no son el estándar actual. Avísame si tengo razón.
fuente
Respuestas:
Con
__future__
la inclusión del módulo, puede acostumbrarse lentamente a los cambios incompatibles o a los que introducen nuevas palabras clave.Por ejemplo, para usar los administradores de contexto, tenía que hacerlo
from __future__ import with_statement
en 2.5, ya que lawith
palabra clave era nueva y ya no debería usarse como nombres de variables. Para usarwith
como palabra clave de Python en Python 2.5 o anterior, necesitará usar la importación desde arriba.Otro ejemplo es
Sin las
__future__
cosas, ambasprint
declaraciones se imprimirían1
.La diferencia interna es que sin esa importación,
/
se asigna a la__div__()
método, mientras que con él__truediv__()
se utiliza. (En cualquier caso,//
llamadas__floordiv__()
).A propósito
print
: seprint
convierte en una función en 3.x, perdiendo su propiedad especial como palabra clave. Entonces es al revés.fuente
from __future__ import braces
: pprint
definitivamente es una función, pero puede haber otras características que podrían usar__future__
. (Editar: ver docs.python.org/3/library/__future__.html donde todavía se usa.)Cuando tu lo hagas
En realidad no estás usando una
import
declaración, sino una declaración futura . Estás leyendo los documentos incorrectos, 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. Le dan un significado nuevo o diferente a las palabras o símbolos en su archivo. De los documentos:
Si realmente desea importar el
__future__
módulo, simplemente hagay luego acceda a él como de costumbre.
fuente
from __future__ import print_function
ambos cambian el comportamiento de laprint
palabra clave y tienen un efecto de tiempo de ejecución equivalente aprint_function = __import__("__future__").print_function
__future__
es un pseudomódulo que los programadores pueden usar para habilitar nuevas funciones de lenguaje que no son compatibles con el intérprete actual . Por ejemplo, la expresión11/4
actualmente se evalúa como2
. Si el módulo en el que se ejecuta ha habilitado la verdadera división al ejecutar:from __future__ import division
la expresión
11/4
evaluaría a2.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:fuente
import __future__ xyz
es un no-op?Se puede usar para usar funciones que aparecerán en versiones más nuevas mientras se tenga una versión anterior de Python.
Por ejemplo
le permitirá usar
print
como una función:fuente
Ya hay algunas respuestas excelentes, pero ninguna de ellas aborda una lista completa de lo que
__future__
declaración admite actualmente.En pocas palabras, la
__future__
declaración obliga a los intérpretes de Python a usar funciones más nuevas del lenguaje.Las características que admite actualmente son las siguientes:
nested_scopes
Antes de Python 2.1, el siguiente código generaría un NameError :
La
from __future__ import nested_scopes
directiva permitirá que esta característica esté habilitada.generators
Se introdujeron funciones generadoras como la siguiente para guardar el estado entre llamadas de función sucesivas:
division
La división clásica se usa 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 por
x/y
, mientras que la división de piso se especifica porx//y
.La
from __future__ import division
directiva obliga al uso de la división de estilo Python 3.0.absolute_import
Permite paréntesis para encerrar múltiples
import
declaraciones. Por ejemplo:En vez de:
O:
with_statement
Agrega la declaración
with
como una palabra clave en Python para eliminar la necesidad detry/finally
declaraciones. Los usos comunes de esto son al hacer E / S de archivos como:print_function
:Fuerza el uso de la
print()
llamada a la función de estilo de paréntesis de Python 3 en lugar de laprint MESSAGE
declaración de estilo.unicode_literals
Introduce la sintaxis literal para el
bytes
objeto. Lo que significa que declaraciones comobytes('Hello world', 'ascii')
pueden expresarse simplemente comob'Hello world'
.generator_stop
Reemplaza el uso de la
StopIteration
excepción utilizada dentro de las funciones del generador con laRuntimeError
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 en tiempo de ejecución.Referencias
fuente
¿O es como decir "Dado que esto es python v2.7, use esa función diferente 'imprimir' que también se ha agregado a python v2.7, después de que se agregó en python 3. Entonces mi 'impresión' ya no será declaraciones (p. ej., print "message") pero funciona (p. ej., print ("message", options). De esa manera, cuando mi código se ejecute en python 3, 'print' no se romperá ".
En
print_function es el módulo que contiene la nueva implementación de 'print' según cómo se comporta en python v3.
Esto tiene más explicación: http://python3porting.com/noconv.html
fuente
Uno de los usos que me pareció muy útil es el módulo
print_function
from__future__
.En Python 2.7, quería que los caracteres de diferentes declaraciones de impresión se imprimieran en la misma línea sin espacios.
Se puede hacer usando una coma (",") al final, pero también agrega un espacio extra. La declaración anterior cuando se usa como:
Esto imprimirá el valor de
v_num
cada iteración en una sola línea sin espacios.fuente
Después de Python 3.0 en adelante, imprimir ya no es solo una declaración, sino una función. y está incluido en PEP 3105.
También creo que el paquete Python 3.0 todavía tiene estas funcionalidades especiales. Veamos su usabilidad a través de un "programa Pyramid" tradicional en Python:
Si usamos la función de impresión normal, no podremos lograr el mismo resultado, ya que print () viene con una nueva línea adicional. Por lo tanto, cada vez que se ejecute el bucle for interno, se imprimirá * en la siguiente línea.
fuente