Ett programspråk som inte utvecklas och får nya funktioner är inte längre en teknik med en framtid. I stället blir det en teknik från det förflutna. Men det är ingen risk när det gäller Python 3 som har fått flera betydelsefulla nya funktioner – men det kan vara svårt att ha koll på alla om man är upptagen med det dagliga programmeringsslitet.

Här är sex av de nyaste funktionerna i de senaste versionerna av Python 3. De förtjänar inte bara din uppmärksamhet, utan troligen också en plats i ditt programutvecklingsarbete.

F-strängar

Enligt zen för Python ska det finnas ett, och bara ett, uppenbart sätt att göra saker. Strängformatering i Python följer definitivt inte den regeln, för det finns ett gäng sätt att göra det på. Men formatet f-sträng, som kom med Python 3.6, är inte bara det snabbaste sättet, utan också ett av de smidigaste. Trots det finns det många Python-programmerare som har lärt sig strängformatering i äldre versioner av Python och som fortfarande använder det sättet.

För att använda en f-sträng behöver du bara placera variabeln som du vill ha med i strängen i klammerparenteser och sedan dekorera strängen med ett f-prefix.

filename = "file.jpg"f_name_str = f"Your file is {filename}"
Resultat:
Your file is file.jpg
Nästan alla giltiga Python-uttryck kan placeras inom klammerparenteser. Man kan dekorera uttrycken med Pythons interna formateringsspråk för uttryck. Och du kan använda trefaldiga citat för flerradiga f-strängar.

Dessa fördelar innebär att f-strängar är ett behändigt första val för strängformatering, eftersom de kan användas i de allra flesta användningsfall på ett smidigt sätt. Kanske den enda gången då du inte skulle vilja använda f-strängar är när du vill vidarebefordrar godtyckliga formateringsparametrar via instruktionen .format.

En annan fördel: f-strängar renderar mycket snabbare än instruktionen format eller operatorn % för strängrendering. I de flesta fall är f-strängar nästan dubbelt så snabba som format, något snabbare än % och en faktor tio snabbare än formateringsobjektet Template.

Med Python 3.8 fick f-strängarna en ny bonus: intern debugging. Sätt ett likamedtecken i slutet av ett f-strängsuttryck så får du se tilläggsdata när strängen renderas:

filename = "file.jpg"f_name_str = f"Your file is {filename=}"
Resultat:
Your file is filename='file.jpg'

Async

Asynkron programmering, eller bara async, ger dig möjlighet att ordna en kö av många uppgifter som behöver vänta på yttre händelser, som nätverksanrop eller disk-I/O, och att växla mellan dem på ett effektivt sätt. Async är ett sätt att ge en del jobb fördelarna med multitrådning, men med mycket lägre omkostnader. Async-operationer behöver mycket mindre minne och växlar mycket snabbare än trådar.

Python införde biblioteket asyncio i version 3.4 och nyckelorden async/await i version 3.5, och språket har sedan dess byggt ut och förbättrat async-funktionen.

Om du inte redan använder async i din kod så är det värt att pröva på. För varje program som slösar tid på att vänta på disken eller nätverket drar fördel av asynkron kod. Bara ett förbehåll: Async kan vara knepigt att lära sig i början, för det förutsätter att du ser på din kod på ett nytt sätt.

Dataklasser

Med Python 3.7 introducerades dataklasser, ett sätt att skriva klasser som kan lagra många dataelement utan att behöver massor med massproducerad konstruktor- eller initializerkod. Till exempel:

from dataclasses import dataclass
@dataclass
class Student:
name: str
student_id: int
gpa: float

Denna kod genererar automatiskt funktionen __init__ för att tilldela name, student_id, och gpa till sina respektiva variabler i klassinstansen. Den genererar också jämförelseoperatorer till klassen. Den klass som blir resultatet är en klass som alla andra. Enda skillnaden är hur den definieras.

Om du skapar klasser som huvudsakligen är behållare för många namngivna dataelement som är knutna till vissa metoder kan dataklasser göra att du slipper besväret med att skriva detaljerade initialiseringsdetaljer för varje klass.

Tilldelningsuttryck (”valrossoperatorn”)

Här är en vanlig konstruktion:

my_val = func_result()
if my_val == 1:
do_something_else()

Syntaxen för tilldelningsuttryck, även känd som ”valrossoperatorn” gör att du kan kondensera tilldelningen av en variabel i ett lokalt scope till en enda rad:

if (my_val:=func_result()) == 1:
do_something_else()
# my_val continues to be a valid value

Eftersom denna syntax är giltig bara i Python 3.8 och högre bör du bara använda den ny nyare projekt som du vet kommer att använda någon av dessa versioner. Men det är ett praktiskt sätt att slippa massrepeterad kod som man annars ofta ser i Python.

Brytpunktsfunktionen

De flesta Pythonutvecklare använder funktioner i sin Python IDE för avbuggning, till exempel att manuellt lägga in brytpunkter i kod. Funktionen breakpoint(), en nyhet i Python 3.7, låter dig lägga in en brytpunkt i koden manuellt – till exempel i en kodväg som utlöses enbart av vissa villkor. Det gör det enklare att lägga upp interaktiva avbuggningsbeteenden. Med breakpoint(), kan du till och med utlösa en skräddarsydd avbuggningsfunktion i stället för det förvalda pdb, om det finns något som du hellre vill använda.

Förbättringar av typhintning

Under lång tid har Python inte haft något specifikt sätt att ange typer för variabler eller funktionsparametrar. Men nu har typhintning och modulen typing direkt stöd av Pythontolken Typhintning i Python är inte tvingande vid exekvering. Men när de kombineras med felsökningsverktyg kan typhintning skaka fram en hel del buggar som annars kanske inte skulle ställa till något förrän vid användning. Både soloutvecklare och grupper kan dra fördel av detta. Dessutom kan typhintar läggas till successivt till en kodbas vid behov. Du kan till exempel börja med att använda typhintar i gränssnitt som används mellan grupper, sedan i inre gränssnitt.

Framöver kan vi få se mer energisk användning av tredjepartsprojekt som mypyc för att snabba upp exekveringen av Python med hjälp av typhintning. En del prestandaförbättringar är möjliga redan nu, om än i begränsad omfattning. Men det finns gott om andra fördelar redan nu som gäller programmerarproduktivitet (Pythons huvudgren) snarare än rena prestanda.