¿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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta