walrus оператор в питоне

В питоне 3.8 существует walrus operator, который позволяет присваивать переменные доступные в теле, внутри выражений. Walrus operator получил такое название из-за своего сходства с мордой моржа. Этот синтаксис позволяет избегать повторения самого себя, например:
a = [1,2,3,4]

if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
Если не новый синтаксис, то вы бы не смогли назначить переменную внутри выражения. Вам пришлось бы создать переменную выше, что усложнит чтение кода:
a = [1,2,3,4]
n = len(a)

if (n > 10):
print(f"List is too long ({n} elements, expected <= 10)")
Так-же Walrus operator помогает в регулярных выражениях:
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
discount = float(mo.group(1)) / 100.0
Вам нужно было получить доступ к переменной в теле if, поэтому этот оператор очень полезен. Так же этот оператор полезен при чтении из файлов, тк вам нужно проверять EOF, и получить доступ к объекту:
while (block := f.read(256)) != '':
process(block)
Более подробно вы можете ознакомится с синтаксисом на PEP

Или вот пример из реальной жизни:
def get_reply_id_or_none(message):
    if message.reply_to_message:
        return message.reply_to_message.message_id
    return None
Мне требовалось вытащить message_id из reply_to_message. Но проблема в том что reply_to_message может быть None. Поэтому нужно сначала проверить если он пустой, а потом использовать.

Комментарии

Популярные сообщения из этого блога

DOS атака при помощи Python

Ведем телеграм канал через питон

Django migrations не видит изменения моделей