Walrus operator (Assignment Expressions)

Walrus operator (česky někdy jako „operátor mrože“) je syntaktický prvek v jazyce Python, reprezentovaný symbolem :=. Oficiálně se nazývá Assignment Expressions (přiřazovací výrazy). Do jazyka byl uveden ve verzi Python 3.8 na základě návrhu PEP 572.

Svůj populární název získal podle toho, že symbol := otočený o 90 stupňů připomíná oči a kly mrože.

Základní princip

Standardní přiřazení v Pythonu pomocí = je příkaz (statement). To znamená, že nemůže být součástí jiného výrazu. Naproti tomu walrus operator umožňuje hodnotu přiřadit a zároveň ji hned vrátit jako výsledek výrazu.

Standardní zápis:

n = len(data) if n > 10: print(f"Příliš mnoho prvků: {n}")

Zápis s walrus operátorem:

if (n := len(data)) > 10: print(f"Příliš mnoho prvků: {n}")

Typické případy použití

==== 1. Redukce opakovaných volání funkcí ==== Často se používá tam, kde potřebujeme výsledek funkce testovat v podmínce a následně s ním pracovat uvnitř bloku, aniž bychom funkci volali dvakrát.

==== 2. Zjednodušení cyklů while ==== Tradiční způsob čtení ze souboru nebo streamu vyžaduje inicializaci proměnné před cyklem a její aktualizaci uvnitř cyklu. Walrus to zvládne na jednom řádku:

Čtení souboru po blocích
while (chunk := file.read(1024)): process(chunk)

==== 3. List Comprehensions ==== Umožňuje uložit mezivýsledek výpočtu v rámci generování seznamu, což zvyšuje čitelnost a výkon:

Bez walrusu se f(x) počítá 2x
results = [f(x) for x in data if f(x) > 0]
S walrus operátorem
results = [y for x in data if (y := f(x)) > 0]

Kontroverze a historie

Zavedení tohoto operátoru bylo jedním z nejvíce diskutovaných témat v historii Pythonu.

Kritika: Odpůrci argumentovali, že operátor porušuje filozofii Pythonu (jednoduchost), může vést k nepřehlednému „špagety kódu“ a připomíná chyby z jazyka C (záměna == a =).

Důsledky: Intenzivní a místy až agresivní debata v komunitě vedla k tomu, že Guido van Rossum krátce po schválení PEP 572 rezignoval na svou pozici BDFL (Benevolentního doživotního diktátora).

Osvědčené postupy

Varování: Walrus operator by se měl používat s mírou. Pokud se zápis stává nepřehledným, je vždy lepší zvolit klasické přiřazení na samostatném řádku.

Používejte jej pouze tam, kde prokazatelně zvyšuje čitelnost nebo odstraňuje duplicitu kódu.

Vyhněte se řetězení více walrus operátorů v jednom výrazu.

Související články

Programovací jazyk Python Guido van Rossum PEP (Python Enhancement Proposals)