Как изящно справиться с неудачными импортом будущих функций (__future__) из-за старой версии интерпретатора?

Как вы изящно справляетесь с неудачным импортом в будущем? Если пользователь работает с Python 2.5 и первый оператор в моем модуле:

from __future__ import print_function

Компиляция этого модуля для Python 2.5 завершится неудачно с:

  File "__init__.py", line 1
    from __future__ import print_function
SyntaxError: future feature print_function is not defined

Я хотел бы сообщить пользователю, что ему нужно перезапустить программу с Python> = 2.6, и, возможно, предоставить некоторые инструкции о том, как это сделать. Однако, чтобы процитироватьОПТОСОЗ 236:

Единственные строки, которые могут появляться перед атрибутом future_statement:

Строка документации модуля (если есть).Комментарии.Пустые строкиДругие будущие заявления.

Поэтому я не могу сделать что-то вроде:

import __future__

if hasattr(__future__, 'print_function'):
    from __future__ import print_function
else:
    raise ImportError('Python >= 2.6 is required')

Потому что это дает:

  File "__init__.py", line 4
    from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file

Этот фрагмент из PEP, похоже, дает надежду сделать это встроенным:

Q: Я хочу обернуть future_statements в блоки try / кроме, чтобы я мог использовать другой код в зависимости от того, какую версию Python я использую. Почему я не могу?

A: Извините! попытка / исключение - это функция времени выполнения; future_statements - это, прежде всего, трюки во время компиляции, и ваша попытка / исключение происходит спустя много времени после завершения компиляции. То есть к тому времени, когда вы попытаетесь / исключить, семантика, действующая для модуля, уже сделана. Так как попытка / кроме не будет выполнять то, что онвыглядит Как это должно быть достигнуто, это просто не разрешено. Мы также хотим, чтобы эти специальные заявления были очень легко найти и распознать.

Обратите внимание, что выМожно импортируйте __future__ напрямую и используйте содержащуюся в нем информацию вместе с sys.version_info, чтобы выяснить, в каком выпуске вы работаете, относительно статуса данной функции.

Идеи?

Ответы на вопрос(3)

Ваш ответ на вопрос