Как вы грациозно обрабатываете неудачные будущие функции импорта? Если пользователь работает с 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 и, возможно, предоставить некоторые инструкции о том, как это сделать. Однако, чтобы процитировать PEP 236:
Единственные строки, которые могут появляться до будущее_значение:
- Модуль docstring (если есть).
- Комментарии.
- Пустые строки.
- Другие future_statements.
Поэтому я не могу сделать что-то вроде:
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, похоже, дает надежду сделать это inline:
В: Я хочу свернуть future_statements в try/except blocks, поэтому я могу использовать разные коды, в зависимости от которых версия Python Я бегу. Зачем не могу я?
A: Извините! try/except - это время выполнения особенность; future_statements - прежде всего компиляционные трюки, и ваша попытка/исключается компилятор сделан. То есть, время, которое вы пытаетесь/кроме, семантика в действительности для модуля уже есть сделано сделка. Поскольку try/except не выполнит то, что выглядит как это должно быть, просто не допускается. Мы также хотим сохранить эти специальные заявления очень легко найти и распознать.
Обратите внимание, что вы можете импортировать __future__ напрямую, и используйте информацию в он, наряду с sys.version_info, выяснить, где релиз вы работа под подставками относительно данный статус функции.
Идеи?