Как изящно справиться с неудачными импортом будущих функций (__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, чтобы выяснить, в каком выпуске вы работаете, относительно статуса данной функции.
Идеи?