Guido van Rossum het voorgestel om patroonpasoperateurs by Python te voeg

Guido van Rossum voorgelê konsep vir gemeenskapshersiening spesifikasies vir die implementering van patroonpasoperateurs (passing en geval) in Python. Daar moet kennis geneem word dat voorstelle om patroonpasoperateurs by te voeg, reeds in 2001 en 2006 gepubliseer is (pep-0275, pep-3103), maar is verwerp ten gunste van die optimalisering van die "if ... elif ... else"-konstruk vir die samestelling van bypassende kettings.

Die nuwe implementering is baie soos die "pas"-operateur wat in Scala, Rust en F# verskaf word, wat die resultaat van 'n gespesifiseerde uitdrukking vergelyk met 'n lys patrone wat in blokke gelys word, gebaseer op die "geval"-operateur. Anders as die "skakelaar"-operateur beskikbaar in C, Java en JavaScript, bied "pas"-gebaseerde uitdrukkings baie meer wye funksionaliteit. Daar word kennis geneem dat die voorgestelde operateurs die leesbaarheid van die kode sal verbeter, die vergelyking van arbitrêre Python-voorwerpe en ontfouting sal vereenvoudig, en ook die betroubaarheid van die kode sal verhoog danksy die moontlikheid van uitgebreide statiese tipe kontrolering.

def http_error(status):
wedstrydstatus:
geval 400:
gee terug "Slegte versoek"
saak 401|403|404:
keer terug "Nie toegelaat nie"
geval 418:
keer terug "Ek is 'n teepot"
geval_:
gee terug "Iets anders"

Byvoorbeeld, jy kan voorwerpe, tuples, lyste en arbitrêre rye uitpak om veranderlikes op grond van bestaande waardes te bind. Dit word toegelaat om geneste sjablone te definieer, addisionele “as”-toestande in die sjabloon te gebruik, maskers te gebruik (“[x, y, *rus]”), sleutel/waarde-afbeeldings (byvoorbeeld, {“bandwydte”: b, “latency” ”: l} om “bandwydte” en “latency” waardes en woordeboek te onttrek), onttrek subtemplates (":=" operateur), gebruik benoemde konstantes in sjabloon. In klasse is dit moontlik om bypassende gedrag aan te pas deur die "__match__()" metode te gebruik.

van dataklasse invoer dataklas

@dataklas
klas punt:
x: int
y: int

def whereis (punt):
wedstrydpunt:
geval Punt (0, 0):
print("Oorsprong")
geval Punt (0, y):
druk(f"Y={y}")
geval Punt (x, 0):
druk(f"X={x}")
geval Punt():
print("Iewers anders")
geval_:
print ("Nie 'n punt nie")

wedstrydpunt:
geval Punt(x, y) as x == y:
druk(f"Y=X by {x}")
geval Punt (x, y):
print(f"Nie op die diagonaal nie")

ROOI, GROEN, BLOU = 0, 1, 2
pas kleur:
kassie .RED:
druk ("Ek sien rooi!")
saak .GROEN:
print("Gras is groen")
geval .BLU
E:
print(“Ek voel die blues :(“)

'n Stel is voorberei vir hersiening kolle met eksperimentele implementering voorgestelde spesifikasie, maar die finale weergawe is steeds bespreek. Byvoorbeeld, aangebied In plaas van die uitdrukking "geval _:" vir die verstekwaarde, gebruik die sleutelwoord "else:" of "default:", aangesien "_" in ander kontekste as 'n tydelike veranderlike gebruik word. Ook twyfelagtig is die interne organisasie, wat gebaseer is op die vertaling van nuwe uitdrukkings in greepkode soortgelyk aan dié wat gebruik word vir "if ... elif ... else" konstrukte, wat nie die verlangde prestasie sal verskaf wanneer baie groot stelle vergelykings verwerk word nie.

Bron: opennet.ru

Voeg 'n opmerking