¿Cómo tratar con gracia las futuras funciones fallidas (__futuro__) importaciones debido a la versión anterior del intérprete?
¿Cómo manejas con gracia las futuras importaciones fallidas de funciones? Si un usuario se está ejecutando usando Python 2.5 y la primera instrucción en mi módulo es:
from __future__ import print_function
Compilar este módulo para Python 2.5 fallará con un:
File "__init__.py", line 1
from __future__ import print_function
SyntaxError: future feature print_function is not defined
Me gustaría informar al usuario que necesita volver a ejecutar el programa con Python> = 2.6 y tal vez proporcionar algunas instrucciones sobre cómo hacerlo. Sin embargo, para citarPEP 236:
Las únicas líneas que pueden aparecer antes de una declaración futura son:
El módulo docstring (si lo hay).ComentariosLíneas en blanco.Otras declaraciones futuras.Entonces no puedo hacer algo como:
import __future__
if hasattr(__future__, 'print_function'):
from __future__ import print_function
else:
raise ImportError('Python >= 2.6 is required')
Porque produce:
File "__init__.py", line 4
from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
Este fragmento del PEP parece dar esperanza de hacerlo en línea:
P: Quiero ajustar future_statements en bloques try / except, para poder usar un código diferente dependiendo de la versión de Python que esté ejecutando. ¿Por qué no puedo?
A: lo siento! try / except es una característica de tiempo de ejecución; future_statements son principalmente trucos en tiempo de compilación, y su intento / excepción ocurre mucho después de que el compilador haya terminado. Es decir, en el momento en que lo intentas / excepto, la semántica vigente para el módulo ya está hecha. Dado que el intento / excepto no lograría lo quese ve como debería lograr, simplemente no está permitido. También queremos mantener estas declaraciones especiales muy fáciles de encontrar y reconocer.
Tenga en cuenta que ustedpuede importe __future__ directamente y use la información que contiene, junto con sys.version_info, para determinar dónde se encuentra la versión con la que se está ejecutando en relación con el estado de una característica determinada.
Ideas?