La plupart des petites dépendances d'un projet Python remplacent quelque chose déjà installé. Six modules couvrent l'essentiel du besoin, et chacun est un seul import, sans version à figer et sans rien qui casse le jour où il n'est plus maintenu.
argparse transforme un script en commande. ap.add_argument("--limit", type=int, default=20) et une mauvaise valeur sort avec invalid int value: 'plusieurs' après avoir imprimé la ligne d'usage, avant même que le code ne s'exécute. action="store_true" donne un drapeau --dry-run, et analyser ["rendezvous", "--dry-run"] répond Namespace(dossier='rendezvous', dry_run=True, limit=20). Chez Thomas Rieux, vétérinaire à Amiens, ce script liste les rendez-vous du cabinet sans jamais en modifier un.
zoneinfo gère la partie du temps qui n'est pas de l'arithmétique. ZoneInfo("Asia/Kolkata") un matin de septembre donne 2026-09-24T14:30:00+05:30, et convertir vers UTC donne 2026-09-24T09:00:00+00:00. Le décalage d'une demi-heure est la raison de passer par une vraie base de fuseaux plutôt que par un entier d'heures, quand un client du cabinet appelle depuis l'étranger, et cette base est dans la bibliothèque standard depuis Python 3.9.
Trois qui remplacent une boucle qu'on allait écrire
itertools.groupby supprime une boucle de regroupement, avec une condition qui piège tout le monde : il ne regroupe que des séquences déjà adjacentes, donc les rendez-vous doivent d'abord être triés par la même clé. Triés par vétérinaire, il donne d'abord Rieux avec ses rendez-vous du matin, puis Perrault. Une entrée non triée produit silencieusement la même clé deux fois.
itertools.pairwise donne des paires consécutives : à partir des durées [15, 20, 30, 45], il répond [(15, 20), (20, 30), (30, 45)], ce qui est toute boucle calculant une différence entre valeurs consécutives, en un seul appel, depuis Python 3.10. itertools.batched découpe une séquence : sept codes de rendez-vous répondent [('RDV-1', 'RDV-2', 'RDV-3'), ('RDV-4', 'RDV-5', 'RDV-6'), ('RDV-7',)], et le dernier groupe incomplet est le cas qu'un découpeur écrit à la main traite mal.
Celui qui est une décision de sécurité plutôt qu'un confort
secrets est celui qu'il faut connaître par son nom. secrets.token_urlsafe(16) renvoie une chaîne de 22 caractères, utilisable dans un lien de confirmation de rendez-vous, tirée de la source cryptographique du système d'exploitation. Le module random n'a pas cette propriété : il est rapide, reproductible et prévisible à partir de sa propre sortie, ce qui convient exactement pour mélanger un jeu de cartes et pas du tout pour un lien de confirmation envoyé par courriel. Utiliser random à la place de secrets est une vraie faille sur laquelle aucun test n'échoue, et c'est la raison pour laquelle les deux modules existent séparément.
Deux qui comblent les bords
textwrap et shutil couvrent ce qui reste. textwrap.shorten(texte, width=24, placeholder=" ...") donne un très long nom de ch ... pour le nom d'un chat inscrit au cabinet, en coupant sur une frontière de mot plutôt qu'en plein milieu, et shutil.disk_usage("/").free répond en octets, ce qui est le contrôle qu'un script qui écrit des dossiers médicaux devrait faire avant de commencer plutôt qu'après avoir échoué.
Ce qu'on installe en 2026
L'index des modules de la documentation standard est l'outil, gratuit, et l'habitude à prendre est de l'ouvrir avant d'ajouter une dépendance plutôt qu'après. Il a remplacé le fait de chercher un paquet d'abord, ce qui trouve toujours un résultat, parce que quelqu'un a déjà publié un paquet pour tout ce qui figure dans cette liste.
Python 3.14 est ce que ces versions supposent, gratuit et open source. Trois des six modules ci-dessus ont reçu la fonction précise nommée ici après 2020, donc une base de code figée sur un interpréteur ancien en a moins que cette page ne le suggère, et vérifier la note de version dans la documentation est une habitude de dix secondes qui évite une erreur d'import déroutante.
Le blocage : ne pas savoir quoi chercher
Le blocage, ce n'est pas de savoir quoi chercher, ce qu'aucune lecture ne résout directement. Personne ne cherche pairwise sans connaître le mot, et la boucle qui calcule des différences entre lectures consécutives est réécrite à la main cent fois parce qu'elle est assez simple pour être écrite ainsi.
Ce qui marche vraiment, c'est de lire la page d'index d'un module chaque fois qu'une boucle qu'on écrit a l'air générique. Une boucle qui groupe, découpe, apparie, compte ou aplatit est l'une des huit fonctions d'itertools ou de collections, et un quart d'heure avec ces deux index est la lecture la plus rentable de ce langage. Les tournures que ces fonctions remplacent sont décrites dans les bases de Python, et le moment où la réponse est réellement une dépendance à ajouter est traité dans les paquets et les environnements.