Понимание причины нового питона: = оператор - PullRequest
3 голосов
/ 20 сентября 2019

Это вопрос метапрограммирования: я хотел бы понять, почему разработчики python представили еще один оператор с новым :=.Я знаю, для чего это.Однако мне хотелось бы знать, почему разработчики выбрали новый символ вместо повторного использования, например, оператора as.

Т.е. почему было сочтено предпочтительным написать

while (command := input("> ")) != "quit":
    print("You entered:", command)

вместо

while input("> ") as command != "quit":
    print("You entered:", command)

1 Ответ

5 голосов
/ 20 сентября 2019

Ответ дан в PEP 572

Альтернативные варианты написания

В целом та же семантика, что и в текущем предложении, но пишется иначе.

EXPR as NAME:

stuff = [[f(x) as y, x/y] for x in range(5)]

Поскольку EXPR as NAME уже имеет значение в операторах import, except и with (с другой семантикой), это может создать ненужныепутать или требовать специального регистра (например, чтобы запретить присваивание в заголовках этих операторов).

(Обратите внимание, что with EXPR as VAR не просто присваивает значение EXPR VAR - он вызывает EXPR.__enter__() и присваивает результат этого VAR.)

Дополнительные причины предпочесть := над этим написанием:

В if f(x) as y цель назначения не выпрыгиваету вас - он просто читается как if f x blah blah и визуально он слишком похож на if f(x) and y.

Во всех других ситуациях, когда допускается предложение as, даже читатели с навыками посредничества должны предвидетьэто предложение (однако необязательно) по ключевому слову that начинает строку, и грамматика связывает это ключевое слово с предложением as:

import foo as bar

except Exc as var

with ctxmgr() as var

Наоборот, выражение присваивания не принадлежит к if или while, который запускаетline, и мы намеренно разрешаем выражения присваивания и в других контекстах.

Параллельная каденция между

NAME = EXPR

if NAME := EXPR

усиливает визуальное распознавание выражений присваивания.

...