Хорошей практикой является применение deprecated нотаций (помечать, что какой-то метод/функционал будет удален в такой-то версии) Можно пойти дальше и указывать какой функционал станет обязательным в следующих версиях.

Если с deprecated еще все более-менее ясно, то как заставить компилятор понимать функционал из будущих версий?

Для этого в Python есть модуль __future__. Этот небольшой по размеру модуль -> https://hg.python.org/cpython/file/3.5/Lib/future.py

И работает он следующим образом: когда компилятор проходится по файлам с исходным кодом, анализатор выявляет импорты из __future__. Если такой есть, то флаги компиляции дополняются этими импортами, это и позволяет собрать нужный байт-код.

От сюда и следует понятное требование к импортам из __future__ - они должны быть самыми первыми.

Рассмотрим пример, в 3.5 в модуле __future__ появился флаг generator_stop, который реализует логику PEP 0479. Этот PEP позволяет отлавливать исключение StopIteration внутри генератора. Этот функционал станет доступен только в 3.7, но уже в 3.5 можно его использовать.

from __future__ import generator_stop
# super code

когда компилятор заметит первый импорт, то скомпилирует файл с учетом нового функционала.

По ссылке https://docs.python.org/3.5/library/future.html вы найдете список флагов в модуле __future__. Что интересно, генераторы появились в далекой 2.2 версии, да и деление (привычное по Python3) в тоже время.

Еще полезная ссылка:



Комментарии