Как можно сделать оператор присваивания "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)
Другие вопросы по тегам