Operator walrus (:=), czyli operator przypisania wyrażenia, pojawił się w Pythonie począwszy od wersji 3.8. Został wprowadzony, aby umożliwić przypisywanie wartości zmiennej bezpośrednio w wyrażeniach (na przykład w warunkach pętli lub if), co oznacza, że można uzyskać i wykorzystać wynik funkcji lub obliczenia od razu, nie powtarzając wywołania dwa razy.
Problem, który rozwiązuje walrus — konieczność dublowania obliczeń lub pisania zbędnych linii kodu tylko dla przypisania: przed jego wprowadzeniem trzeba było wykonać osobne wywołanie, a następnie wykorzystać wynik.
Rozwiązanie: teraz wyrażenie można od razu przypisywać do zmiennej wewnątrz warunku, co sprawia, że kod jest bardziej zwięzły i, czasami, bardziej czytelny. Ważne jest, aby pamiętać, że czasami nadmierne stosowanie walrus utrudnia zrozumienie kodu, szczególnie dla mniej doświadczonych kolegów.
Przykład kodu:
while (line := input('Wprowadź ciąg: ')) != 'exit': print(f'Wprowadziłeś: {line}')
Kluczowe cechy:
Czy można użyć operatora walrus do przypisania wartości zmiennej globalnej?
Tak, można, jednak walrus działa w zakresie widoczności, w którym został zastosowany. Należy pamiętać o zasadzie LEGB i ostrożnie używać zmiennych poza funkcjami.
Jaka jest różnica między x = expr a (x := expr)?
x = expr — to samodzielna instrukcja przypisania, podczas gdy (x := expr) — to wyrażenie, które zwraca wynik expr i przypisuje go x wewnątrz innego wyrażenia. W wielu przypadkach drugie można użyć w warunkach if, w pętli while lub w wyrażeniach listowych.
Czy walrus może być używany wewnątrz wyrażeń listowych i generatorów?
Tak, walrus jest często stosowany w comprehension, co jest szczególnie wygodne, aby uniknąć powtarzających się obliczeń.
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # Tutaj n zapisuje wynik int(s), oszczędzając obliczenia
Programista pisze jeden długi i zawiły if z wieloma zagnieżdżonymi walrus:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
Zalety:
Wady:
Świadome zastosowanie dla oszczędności obliczeń i czytelności:
while (line := sys.stdin.readline()) != '': process(line)
Zalety:
Wady: