Sujet : python
-
Python 3.10 après sa fin de vie : repérer les interpréteurs et reconstruire les environnements
Le tableau de cycle de vie du projet Python fixe la fin de vie de Python 3.10 au 1er octobre 2026. Recenser les interpréteurs réellement utilisés par les services, les environnements virtuels et les images, puis reconstruire et tester chaque application sur une branche prise en charge.
-
Concevoir un outil en ligne de commande Python : argparse, main() et codes de sortie
Placer l'interface dans une fonction main(argv) -> int enregistrée comme script console, valider avec les paramètres type et choices d'argparse et respecter la convention des codes de sortie (0 pour le succès, 2 pour une erreur d'utilisation, 1 pour les autres échecs, les codes de sysexits uniquement s'ils sont documentés). Envoyer les résultats sur stdout et les diagnostics sur stderr, et gérer SIGINT ainsi que les ruptures de tube.
-
Construire par bootstrap un intervalle de confiance pour une médiane, un percentile ou un ratio
Rééchantillonner de nombreuses fois les observations brutes avec remise, calculer la statistique sur chaque rééchantillon et lire l'intervalle dans la distribution obtenue ; cela fournit une incertitude pour les médianes, les percentiles, les ratios et les différences lorsqu'aucune formule classique ne s'applique. Indiquer la méthode, le nombre de rééchantillons et la taille de l'échantillon, et ne pas s'y fier pour les percentiles extrêmes de petits échantillons.
-
Lier l’identité de publication npm et PyPI aux artefacts de version approuvés
La publication de confiance par OIDC supprime les jetons de publication stockés, mais sa sécurité dépend toujours du workflow autorisé. Séparer la construction de la publication, protéger les approbations et vérifier l’identité de l’artefact sans considérer sa provenance comme un verdict sur l’absence de code malveillant.
-
Tests à base de propriétés avec des entrées générées
Plutôt que des exemples choisis à la main, un test à base de propriétés énonce un invariant et laisse une bibliothèque générer de nombreuses entrées, en réduisant les échecs à des contre-exemples minimaux ; Hypothesis en est l'implémentation de référence pour Python.
-
Les gestionnaires de contexte en Python : garantir le nettoyage
L'instruction with exécute __enter__ et __exit__ autour d'un bloc, de sorte que fichiers, verrous et connexions soient libérés même en cas d'exception ; contextlib.contextmanager transforme un générateur en gestionnaire de contexte.
-
Des docstrings exploitables par les outils et par les lecteurs
La PEP 257 définit où placer les docstrings et comment les formater ; un style cohérent (Google ou NumPy) avec un résumé d'une ligne, des descriptions d'arguments et de valeurs de retour et des exceptions levées les rend exploitables par les lecteurs, les éditeurs et les générateurs de documentation.
-
Nombres à virgule flottante : pourquoi 0.1 + 0.2 n'égale pas 0.3
La virgule flottante binaire représente la plupart des fractions décimales de façon approximative, si bien que les calculs accumulent des erreurs d'arrondi ; comparer avec des tolérances, additionner avec soin, utiliser des entiers ou des types décimaux pour l'argent et les comptages, et afficher avec suffisamment de chiffres pour permettre un aller-retour exact.
-
Charger YAML en toute sécurité
Les chargeurs YAML complets peuvent instancier des objets arbitraires à partir de nœuds étiquetés ; toujours utiliser un chargeur sûr, figer la sémantique de version YAML, et valider le résultat par rapport à un schéma avant utilisation.
-
Dialectes de motifs glob : signification de * et ** dans .gitignore, .dockerignore, bash, Python et GitHub Actions
Les caractères * et ** n'ont pas le même sens selon l'outil qui évalue le motif : un motif sans barre oblique dans .gitignore correspond à toutes les profondeurs, alors que la même ligne dans .dockerignore ne correspond qu'à la racine du contexte. La récursion globstar de bash est optionnelle, et fnmatch de Python ne tient même pas compte des chemins.
-
Quand asyncio aide, et quand ce n'est pas le cas
asyncio exécute de nombreuses tâches limitées par les entrées-sorties (I/O) sur un seul thread en se suspendant aux points await ; il n'accélère pas le code limité par le calcul (CPU), et les appels bloquants à l'intérieur des coroutines bloquent toute la boucle.
-
Le formatage et le linting automatisés comme contrat d'équipe
Déléguer la mise en forme à un formateur et les vérifications mécaniques à un linter retire les débats de style de la revue ; EditorConfig, PEP 8 et des outils tels que Ruff montrent comment ce contrat peut être encodé dans le dépôt.
-
Les classes Protocol : typage structurel pour le duck typing en Python
Une classe typing.Protocol déclare les méthodes et attributs dont une partie appelante a besoin ; tout objet qui les possède satisfait le type sans en hériter. Définir les protocoles à proximité du code qui en dépend, les garder minimaux, et n'utiliser runtime_checkable que là où isinstance est réellement nécessaire.
-
Trouver une fuite de mémoire avec des instantanés tracemalloc
Démarrer le traçage tôt avec PYTHONTRACEMALLOC ou tracemalloc.start(nframe), prendre un instantané après la montée en charge puis un autre après N itérations, filtrer le bruit des imports, et lire compare_to(..., 'lineno') pour repérer les lignes dont la taille croît proportionnellement à N ; passer au regroupement 'traceback' pour voir les appelants.
-
Argent et autres quantités exactes : utiliser Decimal, pas float
La virgule flottante binaire ne peut pas représenter exactement la plupart des fractions décimales, si bien que les sommes de prix dérivent ; le module decimal fournit une arithmétique décimale exacte avec un arrondi explicite, et les entiers en unité mineure constituent une alternative.
-
Choisir entre threads, processus et asyncio pour une charge de travail Python
Classer d'abord le chemin critique : l'attente d'E/S convient à asyncio (nombreuses connexions, bibliothèques asynchrones) ou à un pool de threads (peu d'appels bloquants) ; le calcul Python pur nécessite des processus ou une build sans GIL (free-threaded). Le code natif qui libère le GIL peut utiliser des threads. Borner chaque pool, choisir explicitement la méthode de démarrage des processus et écrire le chemin d'arrêt.
-
Les dataclasses pour les enregistrements simples
Les dataclasses génèrent __init__, __repr__ et l'égalité à partir des champs annotés ; les dataclasses frozen donnent des objets-valeur immuables, slots réduit la mémoire, et field(default_factory=...) évite le partage de valeurs par défaut mutables.
-
À partir de quelle charge la version free-threaded de CPython surpasse-t-elle un pool de processus pour un service mêlant E/S et calcul CPU ?
Question ouverte : la version free-threaded supprime le GIL mais ajoute une surcharge en mode mono-thread et peut retomber sur le GIL lorsqu'une extension non préparée est importée, tandis que les pools de processus paient le coût du pickling et de la duplication mémoire ; pour quels rapports temps CPU / temps d'attente, quelles tailles d'ensemble de travail et quels nombres de cœurs un pool de threads sur la version free-threaded offre-t-il un meilleur débit par cœur ?
-
Tenter un exercice avant de lire sa solution détaillée procure une meilleure mémorisation à un mois d'une fonctionnalité de langage que lire d'abord la solution
Hypothèse : pour un ingénieur qui apprend une fonctionnalité de langage précise, telle que l'instruction match de Python, travailler un exercice avant de voir la solution détaillée conduit à une meilleure mémorisation différée et à un meilleur transfert qu'étudier d'abord la solution puis travailler un exercice similaire ; un test intra-individu est proposé, avec deux fonctionnalités, deux ordres et un test différé à un mois, sans qu'aucun résultat ne soit affirmé.
-
Annulation asyncio : effectuer le nettoyage sans avaler CancelledError
Garder l'annulation observable par le propriétaire de la tâche tout en libérant les ressources sur le chemin interrompu.
Lisible par machine : JSON