Как можно сделать оператор присваивания "x = y:= f(x)" при использовании выражений присваивания в Python?
Я читаю в Твиттере:
#Python news: Гвидо принял PEP 572. У Python теперь есть выражения присваивания.
if (match := (pattern.search) pattern.search(data)) is not None: print((match.group) mo.group(1)) filtered_data = [y for x in data if (y := f(x)) is not None]
(исправление шахты во 2-й строке кода)
Как указано, PEP 572 - Выражения присваивания описывает это, чтобы присутствовать в Python 3.8:
Это предложение по созданию способа присваивания переменным в выражении с использованием нотации
NAME := expr
,
Я просмотрел описание и примеры и вижу, что это удобный способ избежать повторения вызовов или назначений, поэтому вместо:
match1 = pattern1.match(data)
match2 = pattern2.match(data)
if match1:
return match1.group(1)
elif match2:
return match2.group(2)
или более эффективный:
match1 = pattern1.match(data)
if match1:
return match1.group(1)
else:
match2 = pattern2.match(data)
if match2:
return match2.group(2)
Теперь можно сказать:
if match1 := pattern1.match(data):
return match1.group(1)
elif match2 := pattern2.match(data):
return match2.group(2)
Точно так же теперь можно сказать:
if any(len(longline := line) >= 100 for line in lines):
print("Extremely long line:", longline)
Однако я не понимаю, как этот пример, приведенный в PEP, недействителен:
y0 = y1 := f(x) # INVALID
Будет ли правильно сказать y0 = (y1 := f(x))
? Как это можно использовать?
Примечание для тех, кто интересуется, где это будет доступно: я уже установил Python 3.7, и он там не работает, поскольку PEP в настоящее время отображается как "Статус: Черновик". Тем не менее, в PEP говорится о проверке концепции / эталонной реализации ( https://github.com/Rosuav/cpython/tree/assignment-expressions)_, поэтому речь идет об использовании их версии Python 3.8 alpha 0, которая включает ее.
1 ответ
Как прямо указано в ОПТОСОЗ,
Необязательные выражения присваивания запрещены на верхнем уровне в правой части оператора присваивания; например, следующее не разрешено:
y0 = y1 := f(x) # INVALID
Опять же, это правило включено, чтобы избежать двух визуально похожих способов сказать одно и то же.
И позже
Как следует из раздела "Исключительные случаи" выше, он никогда не допускается на том же уровне, что и
=
, Если требуется другая группировка, следует использовать круглые скобки....
# INVALID x = y := 0 # Valid alternative x = (y := 0)