Как работают выражения присваивания `: =` в Python? - PullRequest
0 голосов
/ 06 февраля 2019

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

while line := fp.readline():
    do_stuff(line)

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

>>> w:=1
  File "<stdin>", line 1
    w:=1
     ^
SyntaxError: invalid syntax

Теперь, поработав с ним, я понял, что следующие работы:

>>> (w:=1)
1

Но это кажется таким непитонным.Это единственный оператор, который требует скобки:

>>> w = 1
>>> w + w
2
>>> w == w
True
>>> w is w
True
>>> w < w
False

Есть ли причина, по которой синтаксический анализатор обрабатывает его иначе, чем буквально что-либо еще в Python ...?Я чувствую, что что-то упустил.Это не просто оператор.

Было бы очень полезно использовать := в REPL для назначения переменных, поскольку значение будет отображаться.


(Обновление: я делаюне поощряйте дискуссию по этому деликатному вопросу. Пожалуйста, не оставляйте комментарии или ответы, кроме полезных.)

1 Ответ

0 голосов
/ 06 февраля 2019

Как упомянуто GreenCloakGuy , это необходимо, чтобы избежать путаницы, как сказано здесь , я думаю, что эта строка суммирует все:

нетсинтаксическая позиция, где оба = и: = действительны.

Это также делает такие вещи недействительными, потому что слишком запутанно:

y0 = y1 := f(x)
foo(x = y := f(x))
...