De walrus-operator (:=), of assignment expression operator, is geïntroduceerd in Python vanaf versie 3.8. Het is ingevoerd om het mogelijk te maken om een waarde toe te wijzen aan een variabele direct in expressies (bijvoorbeeld in de voorwaarden van lussen of if-statements), dat wil zeggen, het resultaat van een functie of berekening onmiddellijk te verkrijgen en te gebruiken, zonder de oproep twee keer te herhalen.
Het probleem dat walrus oplost, is de noodzaak om berekeningen te dupliceren of onnodige regels code te schrijven alleen voor toewijzing: voor de introductie moest er een aparte oproep worden gedaan en werd het resultaat daarna gebruikt.
Oplossing: nu kan de expressie direct aan een variabele binnen een voorwaarde worden toegewezen, wat de code beknopter en soms leesbaarder maakt. Het is belangrijk om te onthouden dat overmatig gebruik van walrus de begrijpelijkheid van de code kan bemoeilijken, vooral voor minder ervaren collega's.
Voorbeeldcode:
while (line := input('Voer een string in: ')) != 'exit': print(f'Je hebt ingevoerd: {line}')
Belangrijke kenmerken:
Kan de walrus-operator worden gebruikt voor het toewijzen van een waarde aan een globale variabele?
Ja, dat kan, echter, walrus werkt in de scope waar deze is toegepast. Het is belangrijk om de LEGB-regel in gedachten te houden en zorgvuldig om te gaan met variabelen buiten functies.
Wat is het verschil tussen x = expr en (x := expr)?
x = expr is een zelfstandige toewijzingsinstructie, terwijl (x := expr) een expressie is die het resultaat van expr teruggeeft en dit aan x toewijst binnen een andere expressie. In veel gevallen kan de tweede worden gebruikt in if-voorwaarden, in while-lussen of in list comprehensions.
Kan walrus binnen list comprehensions en generators worden gebruikt?
Ja, walrus wordt populair gebruikt in comprehensions, wat vooral handig is om herhaalde berekeningen te vermijden.
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # Hier slaat n het resultaat van int(s) op, bespaart rekeningen
Een ontwikkelaar schrijft één lange en verwarrende if met meerdere geneste walrus:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
Voordelen:
Nadelen:
Bewust gebruik om berekeningen te besparen en leesbaarheid:
while (line := sys.stdin.readline()) != '': process(line)
Voordelen:
Nadelen: