Как можно сделать оператор присваивания "x = y: = f (x)" при использовании выражений присваивания в Python? - PullRequest
0 голосов
/ 05 июля 2018

Я читаю в Твиттере :

# Новости Python: Гвидо принял 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 Ответ

0 голосов
/ 05 июля 2018

Как явно указано в PEP,

Запрещенные в скобках выражения присваивания запрещены на верхнем уровне в правой части оператора присваивания; например, следующее не разрешено:

y0 = y1 := f(x)  # INVALID

Опять же, это правило включено, чтобы избежать двух визуально похожих способов сказать одно и то же.

А , позже ,

Как следует из раздела «Исключительные случаи» выше, он никогда не допускается на том же уровне, что и =. Если требуется другая группировка, следует использовать круглые скобки.

...

# INVALID
x = y := 0

# Valid alternative
x = (y := 0)
...