TGViewer
Python Заметки Python Заметки @pythonotes · 2.2K subscribers
Post #352 2.06K
Где можно применять моржовый (walrus) оператор? (Py3.8+)

Очевидное назначение моржового оператора - сократить количество кода. Сделать присвоение значения переменной и его использование в одно действие. Чаще всего используется в конструкциях if и while

if match := pattern.search(data):
print(match.groups())

while chunk := file.read(1024):
process(chunk)


Можно ли использовать его внутри f-string?

print(f'{x:=10}')
# NameError: name 'x' is not defined


Это синтаксис форматирования а не walrus. Чтобы превратить выражение в walrus используем скобки

print(f'{(x:=15)}')
# '15'
print(x)
# 15


Получается, что скобки помогут использовать walrus не только с if, while, match и тд.

Пример не самого очевидного присвоения значений переменным

x = (y := 1, 2)
print(x)
print(y)
# (1, 2)
# 1


Вызов функции тоже может быть использован как скобки для walrus

def get(): return 2
def do_it(x, y): return x + y

x = do_it(y := get(), y+3)
print(x, y)
# 7 2


Два "моржа" на одном пляже в одной строке

def compute(x): return x*2
def get_value(): return 1

if z := compute(x := get_value()):
print(f"compute({x}) = {z}")
else:
print(f"{x} is not valid value")
# compute(1) = 2


В следующем примере мы экономим не только код но и количество расчётов

list1 = [1, 2, 3, 4, 5]
# без walrus
list2 = [x*2 for x in list1 if x*2 % 15 == 0]
# c walrus
list2 = [(n := x*2) for x in list1 if n % 15 == 0]


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

f = lambda v: v*2
[y := f(1), y**2, y**3]
# [2, 4, 8]


Более страшный пример с созданием lambda через walrus

[y := (f := lambda x, i: x*i)(3, 10), z:=f(y, 20), f(z, 30)]
# [30, 600, 18000]

не делайте так

Экономим один вызов lower() в простом выражении

is_palindrome = (w := word.lower()) == w[::-1]


И ещё пример экономии места в файле и времени CPU

try:
10 / 0
except Exception as err:
logger.log(message := f"Error, {err}!")
send_report(message)


А еще не будет ошибкой синтаксиса если использовать walrus перед return.

def calculate(a, b):
return result := a * b


Но, по очевидным причинам, смысла в этом нет 😄

#triks
  • 👍 16
  • 🤯 3
  • ❤ 1
More from @pythonotes
  1. Sep 21, 2026­ WebAssembly это мощная технология позволяющая загружать практически любое приложение в б…
  2. Aug 17, 2026Не так давно столкнулся с API который в ответе с ошибкой присылал только статус-код. Без п…
  3. Jul 20, 2026У меня основная ОС это Linux. Но нередко требуется делать сборку клиента под Windows. Соби…
  4. Jul 13, 2026В прошлый раз был пример с понижением привелегий процесса. Проблема в том, что обратно под…
  5. Jul 6, 2026Модуль pwd может использоваться для считывания информации о пользователях из базы данных п…
  6. Jun 22, 2026Недавно я реализовал Multi Tenancy систему на FastAPI + SQLAlchemy и пересобрал её в небол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →