Python Development
Project Setup
# Create project with uv
uv init my-project
cd my-project
# Add dependencies
uv add litestar
uv add --dev pytest ruff mypy
pyproject.toml
[project]
name = "my-project"
version = "0.1.0"
requires-python = ">=3.13"
dependencies = [ "litestar>=2.0" ]
[tool.ruff]
line-length = 88
target-version = "py313"
[tool.mypy]
strict = true
python_version = "3.13"
Type Hints
from typing import TypeVar , Generic
from collections.abc import Sequence
T = TypeVar ( 'T' )
class Repository ( Generic [ T ]):
async def find_by_id ( self , id : str ) -> T | None :
...
async def save ( self , entity : T ) -> T :
...
def process_items ( items : Sequence [ str ]) -> list [ str ]:
return [ item . upper () for item in items ]
Async Patterns
import asyncio
from collections.abc import AsyncIterator
async def fetch_all ( urls : list [ str ]) -> list [ Response ]:
async with aiohttp . ClientSession () as session :
tasks = [ fetch_one ( session , url ) for url in urls ]
return await asyncio . gather ( * tasks )
async def stream_data () -> AsyncIterator [ bytes ]:
async with aiofiles . open ( 'large.csv' , 'rb' ) as f :
async for chunk in f :
yield chunk
Error Handling
from dataclasses import dataclass
from typing import TypeVar , Generic
T = TypeVar ( 'T' )
E = TypeVar ( 'E' )
@dataclass
class Ok ( Generic [ T ]):
value : T
@dataclass
class Err ( Generic [ E ]):
error : E
Result = Ok [ T ] | Err [ E ]
def divide ( a : int , b : int ) -> Result [ float , str ]:
if b == 0 :
return Err ( "Division by zero" )
return Ok ( a / b )
Testing with pytest
import pytest
from unittest.mock import AsyncMock
@pytest . mark . asyncio
async def test_create_user ():
repo = AsyncMock ()
service = UserService ( repo )
user = await service . create ( "test@example.com" )
assert user . email == "test@example.com"
repo . save . assert_called_once ()
@pytest . fixture
def mock_database ():
with patch ( 'app.database' ) as mock :
yield mock
# Ruff (linting + formatting)
ruff check --fix .
ruff format .
# MyPy (type checking)
mypy --strict .
# pytest
pytest -v --cov= src