Python programmering: Från grunder till produktionskod
En genomgång av Pythons kärnkoncept med fokus på skrivbar, underhållbar kod. Datatyper, funktioner, felhantering och paketstruktur.
Python är ett av de mest använda programmeringsspråken i världen, och det finns en anledning till det. Syntaxen är ren, standardbiblioteket är enormt, och ekosystemet täcker allt från webbapplikationer till maskininlärning. Men att skriva bra Python kräver mer än att kunna grunderna.
Datatyper och variabler
Python är dynamiskt typat, men det betyder inte att du ska ignorera typer. Sedan Python 3.5 har vi type hints, och de är ovärderliga i större kodbaser. Skillnaden mellan ett hobbyprojekt och produktionskod syns ofta i hur typningen hanteras.
from typing import Optional
def find_user(user_id: int) -> Optional[dict]:
"""Hämta användare från databas."""
users = {1: {"name": "Erik", "role": "admin"}}
return users.get(user_id)
# Type hints gör koden självdokumenterande
result: Optional[dict] = find_user(1)
if result:
print(f"Hittade: {result['name']}")Notera att type hints inte ger runtime-kontroll — de är metadata som verktyg som mypy och din IDE kan använda för att hitta buggar innan de når produktion.
Funktioner och scope
Pythons funktioner är first-class objects. Du kan skicka dem som argument, returnera dem från andra funktioner, och tilldela dem till variabler. Det ger dig kraftfulla mönster som closures och dekoratörer.
import time
from functools import wraps
def timing(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
elapsed = time.perf_counter() - start
print(f"{func.__name__} tog {elapsed:.4f}s")
return result
return wrapper
@timing
def process_data(items: list[str]) -> list[str]:
return [item.upper() for item in items]Felhantering som inte är slarvig
Ett vanligt misstag är att fånga Exception brett. Det döljer buggar och gör felsökning till en mardröm. Var specifik med vad du fångar, och logga alltid tillräckligt med kontext.
import logging
logger = logging.getLogger(__name__)
def parse_config(path: str) -> dict:
try:
with open(path) as f:
return json.load(f)
except FileNotFoundError:
logger.error(f"Konfigurationsfil saknas: {path}")
raise
except json.JSONDecodeError as e:
logger.error(f"Ogiltig JSON i {path}: {e}")
raise ValueError(f"Kan inte parsa {path}") from efrom e bevarar den ursprungliga exception-kedjan, vilket gör det möjligt att spåra rotorsaken i loggar.
Paketstruktur för riktiga projekt
Släng inte allt i en fil. En vettig projektstruktur ser ut ungefär så här:
myproject/
├── src/
│ └── myproject/
│ ├── __init__.py
│ ├── core.py
│ ├── models.py
│ └── utils.py
├── tests/
│ ├── test_core.py
│ └── test_models.py
├── pyproject.toml
└── README.mdAnvänd pyproject.toml istället för setup.py — det är standarden sedan PEP 518. Och kör alltid i en virtuell miljö. python -m venv .venv kostar dig tre sekunder och sparar timmar av beroendekonflikter.
List comprehensions och generatorer
List comprehensions är Pythons brödkniv. De är snabbare än loopar och mer läsbara när de används rätt. Men det finns en gräns — om din comprehension är längre än en rad, skriv en loop istället.
# Bra: enkelt och tydligt
active_users = [u for u in users if u.is_active]
# Bättre för stora dataset: generator
def active_users(users):
for u in users:
if u.is_active:
yield u
# Generatorer håller inte allt i minnet
for user in active_users(million_users):
process(user)Sammanfattning
Python belönar disciplin. Använd type hints, strukturera dina projekt ordentligt, hantera fel specifikt, och testa din kod. Språket ger dig frihet — men frihet utan struktur leder till kod ingen vill underhålla.
Om du planerar att deploya din Python-applikation behöver du pålitlig hosting. mehosting.com erbjuder hosting som fungerar bra för Python-projekt med SSH-tillgång och flexibel serverkonfiguration.
Behöver du hosting för ditt projekt?
Kolla in mehosting.com