Bedste praksis i Python

Bedste praksis i Python

Denne artikel forklarer bedste praksis i Python.

Vi vil forklare bedste praksis i Python med faktiske kodeeksempler og introducere måder at skrive læsbar og vedligeholdelsesvenlig kode på.

YouTube Video

Bedste praksis i Python

Gør læsbarhed til den højeste prioritet

Lad os først se på 'at gøre læsbarhed til den højeste prioritet.'.

Python er et sprog, der vægter 'læsbarhed'. Prioriter først at skrive kode, hvis hensigt er tydelig ved første øjekast.

1# Bad example: unclear variable names
2a = 10
3b = 5
4c = a * b

I denne kode formidler variabelnavnene ikke deres betydning, så det tager tid for andre at forstå det senere.

1# Good example: descriptive variable names
2price = 10
3quantity = 5
4total_cost = price * quantity

Ved at gøre variabelnavne specifikke fungerer din kode i sig selv som dokumentation.

Skriv eksplicit kode

Lad os derefter se på 'at skrive eksplicit kode.'.

I Python foretrækkes 'eksplicit hensigt' frem for 'implicit opførsel'.

1# Bad example: implicit truthy check
2if data:
3    process(data)

I denne kode er det uklart, hvad der forventes af data, hvilket skaber grobund for fejl.

1# Good example: explicit condition
2if len(data) > 0:
3    process(data)

Ved at gøre betingelser eksplicitte stemmer kodens hensigt overens med dens specifikation.

Hold funktioner små og fokuseret på et enkelt ansvar

Lad os nu se på 'at holde funktioner små og fokuseret på et enkelt ansvar.'.

Når én funktion gør for mange ting, bliver test og vedligeholdelse vanskeligt.

1# Bad example: doing too many things
2def handle_user(user):
3    save_to_database(user)
4    send_email(user)
5    write_log(user)

I denne kode bliver processerne tæt koblet sammen, hvilket gør genbrug og ændringer vanskeligere.

1# Good example: single responsibility
2def save_user(user):
3    save_to_database(user)
4
5def notify_user(user):
6    send_email(user)
7
8def log_user(user):
9    write_log(user)

Ved at opdele funktioner bliver deres roller tydelige og testning lettere.

Brug type hints aktivt

Lad os nu se på 'at bruge type hints aktivt.'.

Type hints fungerer som dokumentation og er et stærkt værktøj til at forhindre fejl.

1# Bad example: Without type hints
2def add(a, b):
3    return a + b

I denne kode er typerne af argumenter og returværdier uklare, hvilket gør fejlbrug sandsynligt.

1# Good example: With type hints
2def add(a: int, b: int) -> int:
3    return a + b

Med type hints forbedres IDE-autofuldførelse, statisk analyse og læsbarhed betydeligt.

Angiv eksplicit muligheden for at returnere None

Nu ser vi på 'eksplicit at angive muligheden for at returnere None.'.

Funktioner, der kan returnere None, bliver ofte overset af dem, der bruger dem.

1# Bad example: Ambiguous return value
2def find_user(user_id):
3    if user_id == 1:
4        return {"id": 1, "name": "Alice"}
5    return None

I denne kode er det uklart, om der vil være en returværdi.

1# Good example: explicit return type
2from typing import Optional, Dict, Any
3
4def find_user(user_id: int) -> Optional[Dict[str, Any]]:
5    if user_id == 1:
6        return {"id": 1, "name": "Alice"}
7    return None

Ved at bruge Optional kan du udtrykke muligheden for at returnere None som en type.

Grib ikke undtagelser for bredt

Lad os derefter se på 'ikke at gribe undtagelser for bredt.'.

Undtagelseshåndtering skal grundlæggende kun fange det, der er nødvendigt.

1# Bad example: catching all exceptions
2try:
3    result = int(value)
4except Exception:
5    result = 0

Denne kode kan skjule fejl, der burde være blevet opdaget.

1# Good example: catch specific exception
2try:
3    result = int(value)
4except ValueError:
5    result = 0

Ved at begrænse undtagelser overser du ikke uventede problemer.

Håndter ressourcer sikkert med with-sætningen

Lad os nu se på 'at håndtere ressourcer sikkert med with-sætningen.'.

Ressourcer som filer og låse skal altid frigives pålideligt.

1# Bad example: manual close
2file = open("data.txt")
3content = file.read()
4file.close()

I denne kode kan close() muligvis ikke blive kaldt, hvis der opstår en undtagelse.

1# Good example: using context manager
2with open("data.txt") as file:
3    content = file.read()

Ved at bruge en with-sætning udføres oprydning sikkert, selv hvis der opstår en undtagelse.

Brug listeforståelser (list comprehensions) passende

Lad os nu se på 'at bruge listeforståelser passende.'.

Enkle transformationsprocesser kan skrives kortfattet med listeforståelser.

1# Bad example: Verbose loop
2squares = []
3for i in range(10):
4    squares.append(i * i)

I denne kode er kerneprocessen svær at få øje på.

1# Good example: Clear list comprehension
2squares = [i * i for i in range(10)]

Ved at bruge listeforståelser passende forbedres kodens læsbarhed.

Undgå magiske tal

Lad os nu se på 'at undgå magiske tal.'.

At skrive tal og strenge direkte gør deres betydning uklar.

1# Bad example: magic number
2if status == 404:
3    handle_not_found()

I denne kode antages det, at du kender betydningen af 404.

1# Good example: named constant
2NOT_FOUND = 404
3
4if status == NOT_FOUND:
5    handle_not_found()

At give navne gør hensigter tydelige.

Skriv kode, der er vedligeholdelsesvenlig, ikke kun kode, der 'virker'

Til sidst ser vi på 'at skrive kode, der er vedligeholdelsesvenlig, ikke kun kode, der virker.'.

Det vigtige er, om dit fremtidige jeg eller andre kan læse det.

1# Bad example: Hard to maintain
2def f(x):
3    return x * 1.08 + 100

I denne kode kan specifikationen ikke forstås ud fra koden.

1# Good example: Easy to maintain
2TAX_RATE = 1.08
3BASE_FEE = 100
4
5def calculate_total(price: float) -> float:
6    return price * TAX_RATE + BASE_FEE

Ved at afspejle betydning i navne bliver koden selv til specifikationen.

Sammendrag

Bedste praksis i Python handler om at skrive kode, der er let at forstå, fremfor smart kode. At opbygge små gode vaner fører til kode med færre fejl, som kan bruges i lang tid.

Du kan følge med i ovenstående artikel ved hjælp af Visual Studio Code på vores YouTube-kanal. Husk også at tjekke YouTube-kanalen.

YouTube Video