Я читаю в Твиттере :
# Новости 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, включающей ее.