Страсть Python К Выражениям Назначения – PEP 572

Вы могли бы подумать, что с таким старым языком, как Python, не будет много поводов для волнения, но в течение последних нескольких месяцев PEP-572, предложение добавить новую функцию, поднимало кровяное давление сообщества Python.

Обычно такая ситуация приводила бы к тупику, когда различные фракции чувствовали бы себя плохо из-за возможности проигрыша и либо выполняли, либо не выполняли предложение. В случае с Питоном существование БДФЛ (Благожелательного диктатора на всю жизнь) закоротило то, что в противном случае могло бы продлиться еще много месяцев. Гвидо ван Россум решил этот вопрос, приняв предложение.

2 июля он написал

– Спасибо вам всем. Я приму БОДРОСТЬ духа как есть. Я рад принять *разъяснения* обновления ОПТОСОЗ, если люди захотят представить их в качестве PR в репо peps, и это может даже (в некоторой степени) включать резюме обсуждений, которые у нас были, или откровенно отвергнутые идеи. Но даже без них я думаю, что бодрость духа очень ясна, поэтому я не буду ждать очень долго (может быть, неделю).”

Это заявление прозвучало очень неожиданно, настолько неожиданно, что многие участники дискуссии почти не заметили или не поверили ему. Например, 3 июля Виктор Стиннер написал:

“Я вижу все больше и больше статей (“в Интернете”), в которых говорится, что Гвидо ван Россум уже принял PEP. ОПТОСОЗ уже принят или будет принят?”

Ответ в том, что это принято. Я тоже был удивлен и слегка разочарован, но не потому, что считал это плохой идеей, а потому, что я еще не принял решения и с нетерпением ждал более качественной дискуссии.

Даже сейчас некоторые настолько категорически против, что они клянутся не допускать эту конструкцию в своем коде, когда она будет введена в Python 3.8. Есть даже критика Гвидо за то, что он больше D, чем B в BDFL. Лично я этого не вижу, и я думаю, что Python сильнее для сильного руководства. В других языковых сообществах спор продолжался бы вечно, поскольку обе стороны не желали сдаваться, а прогресс был задержан polarity.in сообщество. Это заставляет задуматься, что может случиться с Python без Гвидо.

ОБНОВЛЕНИЕ от 12 Июля: Гвидо ван Россум Уходит С поста Python BDFL

Так из-за чего весь этот шум?

Идея достаточно проста – разрешить назначение внутри выражений.

В настоящее время назначение в Python-это оператор.

Это означает, что:

A=B

это задание, но

если A==B:

это тест на равенство.

PEP вводит новый оператор присваивания:=, который позволяет присваивать в выражениях, как это возможно в некоторых других языках. 

Теперь вы можете писать такие вещи, как:

while data:=f.read(100): print(данные)

Вероятно, это архетипическое использование назначения в выражении. Присвоение является побочным эффектом выражения, которое вычисляет либо данные, которые являются истинными, либо ложными, если нет данных для чтения. То есть выражение используется для остановки цикла while, но оно также становится доступным для тела цикла.

Принцип заключается в том, что значение выражения присваивается, а также возвращается тому, кто его использует, как будто присвоения никогда не было..

Это может стать более сложным, чем вы можете себе представить, учитывая диапазон мест, в которых могут использоваться выражения. Например, как вы думаете, что здесь происходит?:

myfunction(x=(y:=f(z))

В большинстве случаев, см. PEP для исключения, область действия любой переменной, введенной в назначение выражения, является текущей областью действия. Таким образом, в этом случае y является локальным для кода, в котором вызывается myfunction, а x является ключевым параметром функции.

В принципе, назначение выражения полезно всякий раз, когда вам нужно сохранить результат выражения, пока оно используется для какой-либо другой цели. Я привожу пример из PEP:

результаты = [(x, y, x/y) для x в input_data, если (y := f(x)) > 0]

Порядок оценки вполне может беспокоить новичка, но не намного больше, чем понимание без задания.

PEP был принят, но не полностью закончен – он нуждается в полировке. Будет интересно посмотреть, сохранится ли враждебность после реализации этой функции.

Майк Джеймс-автор книги Programmer’s Python: Everything-это объект, опубликованный в этом месяце издательством I/O Press в рамках библиотеки I Programmer. С подзаголовком “Что-то совершенно другое” это для тех, кто хочет понять более глубокую логику в подходе, который Python 3 применяет к классам и объектам.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *