Her er nyhederne i Python 3.10: Match er en ren schweizerkniv

Foto : Bigstock/Taborov

Her er nyhederne i Python 3.10: Match er en ren schweizerkniv

For anden gang udkommer Python efter en ny årlig udgivelsesplan. Den store nyhed for det hidtil switch-løse sprog er en ny match-sætning, der kan lidt af hvert.

Version2: Med 30 år på bagen har programmeringssproget Python kronede dage. På lister over sprogs popularitet ligger Python enten i toppen eller tæt på.

Python er gået fra at være et scripting-sprog med lav indlæringskurve, til at være et af de foretrukne sprog til videnskabelig programmering, statistik, dataanalyse og kunstig intelligens.

Ligesom i Javascript kan man i Python gøre næsten, hvad man har lyst til på kørselstidspunktet, såsom at udstyre objekter med nye felter og metoder. Det sætter begrænsninger på afviklingshastigheden.

Den danske ekspert i virtuelle maskiner Lars Bak vurderer, at sprog som Python og Javascript kan opnå omkring halvdelen af den ydelse som typestærke sprog, der også afvikles i en virtuel maskine, såsom Java og C#, kan præstere.

Men der er flere måder at gøre tingene på. Det er nemt at kalde C-kode fra Python, og mange Python-biblioteker er implementeret i C, som gør dem lynhurtige.

Når det handler om kunstig intelligens, matricer og vektorer, kan biblioteker udnytte grafikkort, som er mange gange hurtigere, end når tilsvarende operationer skal udføres på cpu-kerner, på grund af parallelisering af lineære vektorberegninger.

På den måde kan Python-koden blive et slags instrumenteringslag for de underliggende højtydende biblioteker, med en nem syntaks, der tillader lidt af hvert og sjældent stiller sig i vejen for programmøren.

Match er en schweizerkniv-switch

En ny version er tæt på af se dagens lys. Den har nummeret 3.10, og er den anden udgave efter en ny udsendelsesplan, hvor der kommer nye versioner én gang om året.

Blandt nyhederne er pattern matching, som også Java og PHP for nylig er blevet udstyret med. Pattern matching stammer fra de funktionelle sprog, og trenden blandt objektorienterede sprog er netop at låne ideer fra den funktionelle verden.

Python har aldrig tidligere haft en switch-sætning, så det er funklende nyt, og den nye konstruktion er en ren schweizerkniv, i forhold til hvilke mønstre sætningen kan håndtere.

På det overordnede plan ser det således ud, med eksempler taget fra dokumentationen:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

På klassisk Python-maner kan en masse forskellige ting anvendes som argument i case-sætningerne. Mønstrene kan bestå af sequences, mappings, primitive datatyper samt klasse-instanser.

Et simpelt eksempel kan se sådan ud:

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the Internet"

Case-sætninger kan også indeholde variable:

# point is an (x, y) tuple
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y={y}")
    case (x, 0):
        print(f"X={x}")
    case (x, y):
        print(f"X={x}, Y={y}")

Og med klasse-instanser:

class Point:
    x: int
    y: int
 
def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print(f"Y={y} and the point is on the y-axis.")
        case Point(x=x, y=0):
            print(f"X={x} and the point is on the x-axis.")
        case Point():
            print("The point is located somewhere else on the plane.")
        case _:
            print("Not a point")

Lister kan også anvendes som argument til case-sætningen:

match points:
    case []:
        print("No points in the list.")
    case [Point(0, 0)]:
        print("The origin is the only point in the list.")
    case [Point(x, y)]:
        print(f"A single point {x}, {y} is in the list.")

Man kan også bruge underscore-wildcard’et på en mere kompleks facon:

match test_variable:
    case ('warning', code, 40):
        print("A warning has been received.")
    case ('error', code, _):
        print(f"An error {code} occurred.")

Men der er mere, som de siger i TV-shoppen:

Man kan også udstyre case-sætningen med en ‘guard’, også kendt som en ‘precondition’, ved at sætte en if-sætning efter case-udtrykket:

match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at {x}.")
    case Point(x, y):

Og der er endda flere muligheder med match-sætningen, end hvad vi har vist her.

Nemmere unions

Python er et sprog, hvor variabeltyper ikke gør det store væsen af sig. Men lidt type-information på en sidetallerken er nu heller ikke dårligt. I Python 3.5 kom muligheden for at antyde typer.

Ligesom i den nye PHP er der nu en nem måde at angive, at en variabel eller parameter kan antage én af to eller flere typer, i stedet for den gamle måde, Union[int, float], at gøre det på:

def square(number: int | float) -> int | float:
    return number ** 2

Context managers er en sætningskonstruktion, hvor ressourcer som eksempelvis fil-handlers kan deallokeres på en robust facon, uden at programmøren skal benytte try-finally eller andre tiltag. Det svarer til Java og C#’s try-with-resources og using, og nyheden er, at man kan have flere context managers i samme blok, som i:

with (
    CtxManager1(),
    CtxManager2()
):

Blandt andre nyheder er forbedrede fejlmeddelelser, som i dette eksempel:

File "example.py", line 1
    expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               ^
SyntaxError: '{' was never closed

– hvor fortolkeren før i tiden blot ville have sagt SyntaxError: invalid syntax og peget på starten af den efterfølgende sætning.

SyntaxError har i det hele taget fået en lang række specialiserede meddelelser, så det bliver nemmere at finde ud af, hvad der er galt.

Der er flere nyheder i den nye version, som er første beta af fire, før den endelige udgave udsendes i starten af september i år. Beta-versionen kan testes på Windows og Mac, mens andre dyr selv må kompilere kildekoden. Links til det hele kan findes i udgivelsesnoterne.

Prøv DataTech gratis

DataTech giver dig ny viden, cases og erfaringer med at lykkes med AI og data science i praksis. Få 3 ugers gratis og uforpligtende prøveabonnement

Klik her