Search on blog:

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.

If you like it
Buy a Coffee