2012-03-27 26 views
9

Estoy empezando a aprender Python, pero estoy obligado a usar un intérprete v2.6.2.¿Qué características de __future__ debo importar en Python v2.6.2?

Quiero llegar lo más cerca posible a Python 3, por ejemplo, utilizando la nueva función print, "verdadera" división, etc.

from __future__ import division 
from __future__ import print_function 
print(1/2, file=sys.stderr) # 0.5 

¿Qué otras características debería importar de __future__?

Creo que podría hacer un general import __future__ pero luego me gustaría tener un comportamiento diferente al actualizar a una versión superior (v2.7 podría tener más funciones en __future__), y mis scripts pueden dejar de funcionar entonces.

+0

¿Estás seguro de que esto es sabio? Si se ve obligado a utilizar Python 2.x, y comienza a escribir código en el estilo de Python 3.x, ¿no le molestará quien sea que le obligue a usar 2.x? –

+1

@DavidHeffernan: No, puedo escribir mis scripts como quiera. Es solo que estoy en una computadora vieja que tiene Python v2.6.2 instalado, y la instalación de Python v3 además no parece ser una opción. – Frank

+1

Instalar Python 3 es totalmente una opción – Amber

Respuesta

7

Bueno, incluso si no había documentation, __future__ también un módulo regular que tiene algo de información acerca de sí mismo:

>>> import __future__ 
>>> __future__.all_feature_names 
['nested_scopes', 'generators', 'division', 'absolute_import', 'with_statement', 'print_function', 'unicode_literals'] 
>>> __future__.unicode_literals 
_Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072) 

Python 2.6 tiene la mayoría de las características ya habilitados, por lo que elegir division, print_function, absolute_import y unicode_literals.

Y no, import __future__ no funcionará como lo crea. Es solo mágico cuando usa el formulario from __future__ import something como la primera declaración en el archivo. Ver the docs para más.

Por supuesto, no importa cuánto importe desde __future__, obtendrá un comportamiento diferente en 3.x.

+0

Me saltaría 'unicode_literals', vea http://stackoverflow.com/questions/809796/any-gotchas-using-unicode-literals-in-python-2-6 – agf

+1

@agf esas son las formas en que el código podría romperse si simplemente agregas ciegamente 'unicode_literals', pero simplemente apuntan a cosas que deberían corregirse de todos modos, de verdad. El enfoque de Python 3 para Unicode es simplemente más sensato. –

+0

@KarlKnechtel O Nick Coglan o Raymond Hettinger recomendó no usarlo, diciendo que incluirlo en '__future__' fue un error. No recuerdo si fue aquí en SO o en una publicación de blog. Acabo de usar ese enlace porque no puedo encontrar el que estoy pensando en este momento. – agf

7

¿Qué otras características debo importar desde __future__?

para obtener el comportamiento más actualizada al día, usted debe, por supuesto, todas las características de importación __future__ que se ofrece, excepto los que se obtienen de todos modos. (La forma en que el sistema está configurado, características de edad no se eliminan incluso después de que están siempre activas.)

Tenga en cuenta que se import __future__no le da todo, y tampoco lo hará from __future__ import *. La sintaxis from ... import ... tiene una carcasa especial para __future__ (que es cómo funciona), pero __future__ sigue siendo un módulo real que puede importar con import __future__. Sin embargo, al hacerlo, podrá conocer los nombres de las funciones reales, así como la información sobre cuándo se hicieron (o se espera que sean) valores predeterminados y cuándo estuvieron disponibles.

>>> [ 
...  name for name in __future__.all_feature_names if 
...  getattr(__future__, name).optional <= 
...  sys.version_info < 
...  getattr(__future__, name).mandatory 
... ] 

['division', 'print_function', 'unicode_literals'] 

es lo que obtengo en 2.7.2.

Cuestiones relacionadas