Python est un langage versatile, mais écrire du bon code Python demande de suivre certaines conventions.

Illustration de code

Structure du projet

Lien vers la section Structure du projet

Organisation des fichiers

Lien vers la section Organisation des fichiers

Un projet Python bien structuré facilite la maintenance :

mon-projet/
├── src/
│   └── mon_package/
│       ├── __init__.py
│       ├── core.py
│       └── utils.py
├── tests/
│   ├── __init__.py
│   └── test_core.py
├── pyproject.toml
└── README.md

Configuration moderne avec pyproject.toml

Lien vers la section Configuration moderne avec pyproject.toml
[project]
name = "mon-projet"
version = "1.0.0"
requires-python = ">=3.11"
dependencies = [
    "requests>=2.28",
    "pydantic>=2.0",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0",
    "ruff>=0.1",
]

Typage et validation

Lien vers la section Typage et validation

Type hints

Lien vers la section Type hints

Le typage améliore la lisibilité et permet la détection d'erreurs :

from typing import Optional
from dataclasses import dataclass

@dataclass
class User:
    name: str
    email: str
    age: Optional[int] = None

    def is_adult(self) -> bool:
        return self.age is not None and self.age >= 18

Validation avec Pydantic

Lien vers la section Validation avec Pydantic
from pydantic import BaseModel, EmailStr, field_validator

class UserCreate(BaseModel):
    name: str
    email: EmailStr
    age: int

    @field_validator("age")
    @classmethod
    def age_must_be_positive(cls, v: int) -> int:
        if v < 0:
            raise ValueError("L'âge doit être positif")
        return v

Tests automatisés

Lien vers la section Tests automatisés

Structure des tests

Lien vers la section Structure des tests
import pytest
from mon_package.core import User

class TestUser:
    def test_create_user(self):
        user = User(name="Alice", email="alice@example.com")
        assert user.name == "Alice"

    def test_is_adult_with_age(self):
        user = User(name="Bob", email="bob@example.com", age=25)
        assert user.is_adult() is True

    @pytest.mark.parametrize("age,expected", [
        (17, False),
        (18, True),
        (None, False),
    ])
    def test_is_adult_edge_cases(self, age, expected):
        user = User(name="Test", email="test@example.com", age=age)
        assert user.is_adult() is expected

Conclusion

Lien vers la section Conclusion

Ces pratiques vous aideront à écrire du code Python de qualité professionnelle.