В новой версии Python (3.8) разработчики планируют добавить новый оператор – "walrus operator". PEP по данному оператору можно поглядеть тут.
В общем виде его можно записать как
переменная := выражение
Однако, в отличии от операции присвоения (=
), результат моржового оператора
также является выражением и может быть использован для, например, сравнения:
if (match := pattern.search(data)) is not None:
# Do something with match
То есть мы получаем результат поиска по регулярке и сразу проверяем, сматчилось ли. С обычным оператором присвоения мы бы получили syntax error.
Наконец-то можно будет писать C-style while-ы:
while chunk := file.read(8192):
process(chunk)
И даже несколько странно выглядящие list comprehension:
filtered_data = [y for x in data if (y := f(x)) is not None]
И если первые два примера мне кажутся вполне логичными и напрашивающимися,
то в 3-ем я начинаю чувствовать нарушение import this
– философии питона.
Новая возможность языка даёт новые возможности запутаться.
И можно сказать, что программисты должны думать о красоте и читаемости кода ("с большой силой приходит большая ответственность" и т.д.). Но, практика показывает, что многих устраивает, что их программа не падает с syntax error.
В любом случае, теоретизировать и обсуждать поздно – PEP принят и будет реализован в рамках Python 3.8. Что ж, ждём!