Guido van Rossum stelde voor om patroonvergelijkingsoperatoren aan Python toe te voegen

Guido van Rossum ingediend ontwerp voor beoordeling door de gemeenschap specificaties voor het implementeren van patroonvergelijkingsoperatoren (match en case) in Python. Opgemerkt moet worden dat voorstellen om patroonvergelijkingsoperatoren toe te voegen al in 2001 en 2006 zijn gepubliceerd (pep-0275, pep-3103), maar werden afgewezen ten gunste van het optimaliseren van de “if... elif... else”-constructie voor het samenstellen van overeenkomende ketens.

De nieuwe implementatie lijkt veel op de "match"-operator in Scala, Rust en F#, die het resultaat van een gespecificeerde expressie vergelijkt met een lijst met patronen die in blokken zijn opgesomd op basis van de "case"-operator. In tegenstelling tot de "switch"-operator die beschikbaar is in C, Java en JavaScript, bieden op "match" gebaseerde expressies veel meer brede functionaliteit. Opgemerkt wordt dat de voorgestelde operators de leesbaarheid van de code zullen verbeteren, de vergelijking van willekeurige Python-objecten en het debuggen zullen vereenvoudigen, en ook de betrouwbaarheid van de code zullen vergroten dankzij de mogelijkheid van uitgebreide statische typecontrole.

def http_error(status):
wedstrijdstatus:
geval 400:
retourneer "Slecht verzoek"
geval 401|403|404:
retourneer "Niet toegestaan"
geval 418:
return "Ik ben een theepot"
geval _:
retourneer "Iets anders"

U kunt bijvoorbeeld objecten, tupels, lijsten en willekeurige reeksen uitpakken om variabelen te binden op basis van bestaande waarden. Het is toegestaan ​​om geneste sjablonen te definiëren, aanvullende “if”-voorwaarden in de sjabloon te gebruiken, maskers (“[x, y, *rest]”), sleutel/waarde-toewijzingen te gebruiken (bijvoorbeeld {“bandbreedte”: b, “latency ”: l} om "bandbreedte"- en "latency"-waarden en woordenboek te extraheren), subsjablonen te extraheren (":=" operator), gebruik benoemde constanten in de sjabloon. In klassen is het mogelijk om het matchgedrag aan te passen met behulp van de “__match__()”-methode.

uit dataclasses importeer dataclass

@dataclass
klasse punt:
x:int
y:int

def waar(punt):
matchpunt:
geval Punt(0, 0):
print("Oorsprong")
geval Punt(0, y):
print(f"Y={y}")
geval Punt(x, 0):
afdrukken(f"X={x}")
hoofdletterpunt():
print("Ergens anders")
geval _:
print("Geen punt")

matchpunt:
case Punt(x, y) als x == y:
print(f"Y=X op {x}")
geval Punt(x, y):
print(f"Niet op de diagonaal")

ROOD, GROEN, BLAUW = 0, 1, 2
overeenkomen met kleur:
geval. ROOD:
print("Ik zie rood!")
geval .GROEN:
print("Gras is groen")
geval .BLU
E:
print(“Ik voel de blues :(“)

Er is een set klaargemaakt ter beoordeling pleisters met experimenteel implementatie voorgestelde specificatie, maar de definitieve versie is nog steeds besproken. Bijvoorbeeld aangeboden In plaats van de uitdrukking "case _:" voor de standaardwaarde gebruikt u het trefwoord "else:" of "default:", aangezien "_" in andere contexten als tijdelijke variabele wordt gebruikt. Ook twijfelachtig is de interne organisatie, die is gebaseerd op het vertalen van nieuwe uitdrukkingen in bytecode vergelijkbaar met die gebruikt voor "if ... elif ... else" -constructies, die niet de gewenste prestaties zullen leveren bij het verwerken van zeer grote sets vergelijkingen.

Bron: opennet.ru

Voeg een reactie