L'odeur de la poussière et du vieux papier dominait la safehouse. Des dossiers s'empilaient sur le bureau, certains ordonnés, d'autres chaotiques. Un code mal écrit, c'est comme un dossier mal rangé : au moment crucial, on ne trouve pas l'information. On se trompe de cible. On meurt. Les bonnes pratiques ne sont pas une question d'esthétique. C'est une question de survie.
PEP 8
La bible. Le guide de style officiel de Python. Pas des lois, mais des conventions. Le langage que tous les professionnels comprennent.
# MAUVAIS - Criard, désordonné, suspect.
def Traiter_Cible (Cible,Parametre):
R=None
if (Parametre>0):
R = Cible*Parametre
return R
# BON - Lisible, discret, professionnel.
def traiter_cible(cible, parametre):
"""Applique un paramètre à une cible et retourne le résultat."""
resultat = None
if parametre > 0:
resultat = cible * parametre
return resultat
Les règles clés :
snake_casepour les fonctions et variables (traiter_cible)CamelCasepour les classes (AgentInfiltre)- 4 espaces pour l'indentation (jamais de tabulations)
- Lignes de moins de 79 caractères
- Espaces autour des opérateurs (
parametre > 0) - Documentation claire (docstrings)
Respecter la PEP 8, c'est parler le même langage que la communauté. C'est se rendre lisible pour celui qui reprendra le code après vous. Ou pour vous, dans six mois, à 3h du matin, avec une balle dans l'épaule.
Lisibilité du code
Le code est lu dix fois plus qu'il n'est écrit. Il doit être clair comme un rapport de mission.
# OBSCUR - Code "astucieux" et dangereux.
x=[n for n in l if n%2 and n>10 and func(n)];m=sum(x)/len(x) if x else 0
# CLAIR - On comprend l'intention en une lecture.
def calculer_moyenne_filtree(liste_nombres):
"""
Calcule la moyenne des nombres impairs > 10 qui passent un test.
"""
nombres_filtres = [
n for n in liste_nombres
if n % 2 != 0 and n > 10 and test_special(n)
]
if not nombres_filtres:
return 0
moyenne = sum(nombres_filtres) / len(nombres_filtres)
return moyenne
Priorité à la clarté :
- Noms explicites (
nombres_filtrespasx) - Fonctions courtes avec une seule responsabilité
- Commentaires qui expliquent le pourquoi, pas le comment
- Éviter la magie noire, les astuces trop complexes
Un code lisible est un code qui ne vous trahira pas quand la pression montera.
Organisation d'un projet Python
Un projet, ce n'est pas un fichier jeté sur le disque. C'est une architecture. Une organisation qui survit au temps.
operation_phantome/ # Racine du projet
├── README.md # Présentation, instructions
├── requirements.txt # Dépendances (pip install -r requirements.txt)
├── .gitignore # Ce qu'il faut ignorer (logs, fichiers sensibles)
├── setup.py # Installation en tant que package (optionnel)
│
├── src/ # Le code source
│ └── operation/
│ ├── __init__.py # Rend le dossier importable
│ ├── infiltration.py # Module d'infiltration
│ ├── exfiltration.py
│ └── communication.py
│
├── tests/ # Les tests (aussi importants que le code)
│ ├── __init__.py
│ ├── test_infiltration.py
│ └── test_communication.py
│
├── data/ # Données, configurations
│ ├── config.json
│ └── cibles.csv
│
├── docs/ # Documentation détaillée
│ └── protocoles.md
│
└── logs/ # Fichiers de log (NE PAS versionner !)
└── operation_20231027.log
Cette structure sépare les préoccupations. src/ pour le code, tests/ pour les vérifications, data/ pour la configuration. Propre. Maintenable. Professionnel.
Comment tester son code (introduction à unittest)
Tester, c'est vérifier chaque pièce de votre arme avant de partir en mission. Ne jamais faire confiance.
# operation/calculs_secrets.py
def chiffrement_simple(message, decalage):
"""Chiffre un message par décalage de lettres (César)."""
if not isinstance(message, str):
raise TypeError("Le message doit être une chaîne")
resultat = ""
for lettre in message:
if lettre.isalpha():
base = ord('A') if lettre.isupper() else ord('a')
nouvelle_lettre = chr((ord(lettre) - base + decalage) % 26 + base)
resultat += nouvelle_lettre
else:
resultat += lettre
return resultat
# tests/test_calculs_secrets.py
import unittest
from operation.calculs_secrets import chiffrement_simple
class TestChiffrementSimple(unittest.TestCase):
"""Tests pour le module de chiffrement."""
def test_chiffrement_basique(self):
"""Test de chiffrement d'un message simple."""
resultat = chiffrement_simple("ALLO", 3)
self.assertEqual(resultat, "DOOR")
def test_dechiffrement(self):
"""Test que le chiffrement est réversible."""
message_original = "SECRET"
decalage = 5
chiffre = chiffrement_simple(message_original, decalage)
dechiffre = chiffrement_simple(chiffre, -decalage)
self.assertEqual(dechiffre, message_original)
def test_gestion_erreurs(self):
"""Test que des entrées invalides lèvent des erreurs."""
with self.assertRaises(TypeError):
chiffrement_simple(123, 3) # Nombre au lieu de chaîne
def test_conservation_non_alpha(self):
"""Test que les caractères non alphabétiques sont conservés."""
resultat = chiffrement_simple("A1B!", 2)
self.assertEqual(resultat, "C1D!")
# Pour exécuter les tests depuis la ligne de commande :
# python -m unittest discover tests/
Les tests unittest :
- Héritent de
unittest.TestCase - Contiennent des méthodes commençant par
test_ - Utilisent des assertions (
assertEqual,assertRaises, etc.) - S'exécutent automatiquement, vérifiant que votre code fait ce qu'il promet
Tester, ce n'est pas douter de ses compétences. C'est douter de l'univers, du temps, de la mémoire, des bibliothèques externes. C'est un scepticisme sain.
J'ai rangé le dernier dossier. La safehouse était en ordre. Chaque chose à sa place. Chaque fichier dans le bon dossier. Chaque fonction testée. Ce n'était pas par obsession du détail. C'était parce que je savais qu'un jour, peut-être bientôt, quelqu'un d'autre aurait besoin de reprendre ce travail. Dans l'urgence. Dans le noir.
Et quand ce moment arriverait, il ne devrait pas perdre du temps à déchiffrer un code obscur ou chercher un fichier perdu. Il devrait pouvoir se concentrer sur l'essentiel : survivre, et accomplir la mission.
Les bonnes pratiques sont la discipline qui sépare l'amateur du professionnel. L'ordre dans le chaos. La clarté dans l'obscurité.
Le désordre tue. La discipline sauve.