Как операторы __future__ узнают синтаксис новых версий python? - PullRequest
0 голосов
/ 09 марта 2020

Я прошел через вопросы о том, как работает модуль future .

Для чего используется __future__ в Python и как / когда его использовать, и как это работает

и

Как __future__ импорт работает под капотом .

Но я до сих пор не понимаю, что как это делает интерпретатор, созданный сегодня, знает синтаксис кода, который является частью будущих выпусков.

Я думаю, что когда они создают интерпретатор python для версии 2.7, они создают код и создают исполняемый файл и не трогайте его или не изменяйте его, и пользователи будут загружать его и использовать его. Допустим, исполняемый файл python 2.7 создан в год 2009 .

И python 3.7 исполняемый файл создается в 2017 , как python 2.7 знает, какой код компилируется при импорте print_function ? Как python 2.7 интерпретатор узнает, какой будет код для функции print_function, который будет введен после создания интерпретатора.

Я смотрю на него правильно или Совершенно неправильно?

Может кто-нибудь, пожалуйста, демистифицировать это.

Ответы [ 2 ]

5 голосов
/ 09 марта 2020

from __future__ import ... - это просто излишне милый способ сказать, что функция доступна сейчас , но вы должны выбрать ее. В будущем это будет по умолчанию или обязательно.

Каждый определенный импорт поставляется с двумя частями информации: версия, в которой функция опционально доступна, и версия, в которой функция станет обязательной . Ни одна функция не удалена из модуля __future__.

По состоянию на Python 3.8 в __future__ доступно девять функций. Все, кроме одного, annotations, являются обязательными. Новый код, который никогда не потребуется запускать в старых версиях Python, не нужно их импортировать. Старый код, который их использует, обновлять не нужно, хотя импорт практически не выполняется. annotations будет оставаться дополнительной функцией до тех пор, пока не будет выпущена Python 4.0; даты для этого нет, но гарантируется, что annotations будет частью этого выпуска, а , а не - обязательной частью любого более раннего выпуска.

2 голосов
/ 09 марта 2020

Python 2.7.0 был выпущен после Python 3.0.0, то есть после того, как print был превращен в функцию. Такие изменения в синтаксисе можно сделать доступными для компилятора путем передачи опций, которые активируются (распознаются) через __future__ import.

Такой новый синтаксис действительно реализован в компиляторе; только активация необязательна. Это означает, что вам необходимо загрузить более новую версию Python, чтобы включить одну из функций __future__. Python 2.7.0 был выпущен в 2010 году, в то время как Python 3.0.0 был выпущен в 2008 году. Таким образом, с точки зрения 2.7 это была «старая» функция. Несмотря на то, что Python 2.5.6 был выпущен через три года после 3.0.0, он не содержит подписку на функцию print, поскольку она не была реализована в этой вспомогательной версии Python ( 2.5.0 , выпущенный в 2006 году). Термин «будущее» здесь относится к будущим (второстепенным) версиям Python, где функция станет обязательной. Но планы (PEP) для этой функции фактически созданы ранее (то есть до того, как будет выпущена версия, которая представляет эту функцию как дополнительную). Например, PEP 479: обработка StopI изменения внутри генераторов :

  • PEP, созданный в 2014 году
  • Необязательный в 3.5.0, выпущенный в 2015 году
  • Обязательный в 3.7, выпущенном в 2018 году

Даже когда функция стала обязательной в 2018 году, планы (ее PEP) были созданы задолго до этого.

__future__ документы дает хороший обзор того, когда функция стала доступной. Не все функции были перенесены на все (второстепенные) версии Python, даже если они поддерживают импорт __future__. Это связано с тем, что функции стали доступны после выпуска этих минорных версий.

...