Как вы изящно справляетесь с неудачным импортом в будущем? Если пользователь работает с 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 :
Единственные строки, которые могут появиться раньше
Будущее:
- Строка документации модуля (если есть).
- Комментарии.
- Пустые строки.
- Другие записи о будущем.
Так что я не могу сделать что-то вроде:
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__
и использовать информацию в
это, наряду с sys.version_info, чтобы
выяснить, где релиз вы
работает под трибунами по отношению к
статус данной функции.
Идеи