Nowy operator := walrus (mors) w Python 3.8
Wyszła pierwsza wersja "Python 3.8 alpha" a w nim pojawił się operator :=
zwany po angielsku walrus
co po polsku znaczy mors
.
Operator ten pozwala na przypisanie wartości do zmiennej w if
, elif
, while
, lambda
, list comprehensions itp.
Tak więc będzie możliwe
while (line := fp.readline()):
# dalszy kod
zamiast
while True:
line = fp.readline()
if line:
break
# dalszy kod
Do tej pory nie było takiej możliwości przypisania ponieważ tradycyjny operator =
nie pozwalał na to. Miało to zapobiegać pomyłkowym użyciom =
zamiast ==
w if
/ elif
/ while
co się (podobno) często zdarza w językach, które na to pozwalają.
Z pomocą pyenv można łatwo (przynajmniej pod Linux) zainstalować nową wersję Pythona i już zacząć testować nowy operator.
Więcej: Try out walrus operator in Python 3.8
[Aktualizacja: 2019.02.19]
Nowy operator pozwala też wykonać takie rzeczy jak
[(x, reszta) for x in range(10) if (reszta := x % 3) > 0]
# [(1, 1), (2, 2), (4, 1), (5, 2), (7, 1), (8, 2)]
lub
func = lambda a, b: 0 if (y := a-b ) == 0 else 1/y
func = lambda a, b: (y := a-b) or (0 if y == 0 else 1/y)
# zamiast
func = lambda a, b: 0 if a-b == 0 else 1/(a-b)
````
a także takie "dziwactwo" jak
```python
(luty := 29) if rok_przestepny else (luty := 28)
Za to takie użycie może już mieć sens
wynik = (linia if len(linia := fp.readline()) > 0 else "- pusta -")
zamiast błędnie dzałającego (bo każde wywołanie readline
zwraca inną linię)
wynik = (fp.readline() if len(fp.readline()) > 0 else "- pusta -")
Podobnie ma to sens gdy każde wywołanie tej samej funkcji wymaga bardzo dużo czasu.
Buy a Coffee