{"id":1213,"date":"2026-08-21T14:28:48","date_gmt":"2026-08-21T14:28:48","guid":{"rendered":"https:\/\/matforge.org\/?p=1213","raw":"https:\/\/matforge.org\/?p=1213"},"modified":"2026-08-21T14:28:48","modified_gmt":"2026-08-21T14:28:48","slug":"modern-scientific-python-tooling-uv-ruff-type-checking","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/","title":{"rendered":"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty","raw":"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 14<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li><strong>UV<\/strong> est devenu le gestionnaire de packages Python par d\u00e9faut pour le calcul scientifique &#8211; 10 \u00e0 100 fois plus rapide que le PIP, avec des fichiers de verrouillage d\u00e9terministes qui rendent la production de flux de travail de recherche reproductible.<\/li>\n<li><strong>Ruff<\/strong> remplace le noir, l&rsquo;isort, le flake8, le pyupgrade et le flocon automatique dans un seul binaire bas\u00e9 sur la rouille. Scipy, Pandas et d&rsquo;autres biblioth\u00e8ques scientifiques majeures l&rsquo;utilisent aujourd&rsquo;hui.<\/li>\n<li><strong>ty<\/strong> (publi\u00e9 en d\u00e9cembre&nbsp;2025) est 20 \u00e0 100&nbsp;fois plus rapide que MyPY et utilise une garantie progressive qui ne cassera pas le code non annot\u00e9, id\u00e9al pour migrer les bases de code de recherche.<\/li>\n<li><strong>PyProject.toml<\/strong> est d\u00e9sormais la source unique de configuration de l&rsquo;ensemble de la cha\u00eene d&rsquo;outils, rempla\u00e7ant les fichiers de configuration dispers\u00e9s comme <code>.flake8<\/code>, <code>.isort.cfg<\/code> et <code>mypy.ini<\/code>.<\/li>\n<li><strong>Pour le calcul scientifique en particulier<\/strong>, Conda reste n\u00e9cessaire pour les d\u00e9pendances non-Python (MPI, CUDA, HDF5), et Pyright est toujours le choix le plus s\u00fbr jusqu&rsquo;\u00e0 ce que TY atteigne la version&nbsp;1.0.<\/li>\n<\/ul>\n<p>Si vous ex\u00e9cutez des flux de travail Scientific Python en 2026, votre cha\u00eene d&rsquo;outils a fondamentalement chang\u00e9. Les packages que vous utilisez pour le calcul &#8211; numpy, scipy, fipy et le reste &#8211; sont les m\u00eames. Mais la fa\u00e7on dont vous les installez, les g\u00e9rez, les peluches et les types de v\u00e9rification est diff\u00e9rente de ce que la plupart des didacticiels, des guides plus anciens et des ordinateurs portables universitaires recommandent encore.<\/p>\n<p>Astral, la soci\u00e9t\u00e9 derri\u00e8re Python le plus populaire de Python (Ruff), a cr\u00e9\u00e9 trois outils qui couvrent d\u00e9sormais l&rsquo;ensemble du flux de travail des d\u00e9veloppeurs&nbsp;: <strong>UV<\/strong> pour la gestion des packages, <strong>Ruff<\/strong> pour le peluche et la mise en forme, et <strong>ty<\/strong> Pour la v\u00e9rification du type. Ensemble, ils remplacent Pip, Venv, Black, Isort, Flake8 et MyPy. C&rsquo;est six outils r\u00e9duits en trois, tous configur\u00e9s \u00e0 partir d&rsquo;un seul fichier <code>pyproject.toml<\/code>.<\/p>\n<p>Cet article couvre la cha\u00eene d&rsquo;outils Python scientifique moderne en 2026. Il explique ce que fait chaque outil, pourquoi le changement s&rsquo;est produit et comment tout configurer, y compris les bizarreries et les limitations qui comptent pour le calcul scientifique. Si vous configurez un nouveau projet de simulation, migrez une base de code existante ou rattrapez votre retard apr\u00e8s le guide \u00ab\u00a0Scientific Python Ecosystem\u00a0\u00bb (voir article <a href=\"https:\/\/matforge.org\/scientific-python-ecosystem-navigating-scipy-numpy-sympy-2\/\">#364<\/a>), c&rsquo;est la mise \u00e0 jour pratique dont vous avez besoin.<\/p>\n<h2>Le paysage de l&rsquo;outillage moderne<\/h2>\n<p>Jusqu&rsquo;en 2024 environ, le flux de travail du d\u00e9veloppeur Scientific Python ressemblait \u00e0 ceci&nbsp;:<\/p>\n<ul>\n<li><strong>Gestion de packages<\/strong>&nbsp;: PIP avec PIP-Tools ou Poetry<\/li>\n<li><strong>Environnements virtuels<\/strong>&nbsp;: VENV ou VirtualEnv<\/li>\n<li><strong>Gestion des versions de Python<\/strong>&nbsp;: pyenv ou pyenv-virtualenv<\/li>\n<li><strong>Linting<\/strong>&nbsp;: flake8, puis pydocstyle, plus pylint pour les v\u00e9rifications de style<\/li>\n<li><strong>Formatage<\/strong>&nbsp;: noir et Isort (et plus tard, Autopep8 et PyUpgrade)<\/li>\n<li><strong>V\u00e9rification des types<\/strong>&nbsp;: myPy<\/li>\n<\/ul>\n<p>Cela signifiait installer six packages Python distincts, maintenir des fichiers de configuration distincts et attendre des \u00e9tapes de r\u00e9solution s\u00e9quentielles. Un simple <code>pip install<\/code> pourrait prendre quelques minutes. Running Black, puis Isort, puis Flake8, alors MyPy pourrait prendre encore plus de temps.<\/p>\n<p>Le quart de travail a commenc\u00e9 lorsqu&rsquo;Astral a sorti Ruff en 2023. Ruff a \u00e9t\u00e9 \u00e9crit dans Rust, con\u00e7u pour remplacer simultan\u00e9ment Black, Isort, Flake8, PyUpgrade et Autoflake, et a couru des ordres de grandeur plus rapidement que les alternatives bas\u00e9es sur Python. Ce succ\u00e8s d&rsquo;adoption a donn\u00e9 \u00e0 Astral l&rsquo;\u00e9lan n\u00e9cessaire pour construire un \u00e9cosyst\u00e8me complet&nbsp;: les UV pour la gestion des paquets et la v\u00e9rification des types.<\/p>\n<p>Fin 2025 et d\u00e9but 2026, la convergence \u00e9tait compl\u00e8te. Le <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">Guide de d\u00e9veloppement scientifique Python<\/a> recommande d\u00e9sormais officiellement Ruff Pour les v\u00e9rifications de style et TY pour la v\u00e9rification du type. Scipy et Pandas ont adopt\u00e9 Ruff. UV a d\u00e9pass\u00e9 la po\u00e9sie dans l&rsquo;adoption au sein des \u00e9quipes de calcul scientifique. L&rsquo;ancienne pile n&rsquo;est pas morte &#8211; elle fonctionne toujours &#8211; mais ce n&rsquo;est plus la valeur par d\u00e9faut pour les nouveaux projets.<\/p>\n<h3>Pourquoi pyproject.toml est important<\/h3>\n<p>L&rsquo;un des changements pratiques les plus importants est le mod\u00e8le de configuration. L&rsquo;ancienne configuration dispers\u00e9e de la pile dans cinq fichiers ou plus&nbsp;:<\/p>\n<ul>\n<li><code>.flake8<\/code> pour les r\u00e8gles de peluche<\/li>\n<li><code>.isort.cfg<\/code> pour le tri des importations<\/li>\n<li><code>mypy.ini<\/code> pour le comportement de v\u00e9rification de type<\/li>\n<li><code>setup.cfg<\/code> pour les m\u00e9tadonn\u00e9es du package<\/li>\n<li><code>pyproject.toml<\/code> (partiellement, pour les syst\u00e8mes de construction)<\/li>\n<\/ul>\n<p>L&rsquo;outillage moderne centralise tout dans <code>pyproject.toml<\/code>. Un seul fichier d\u00e9finit le package, les d\u00e9pendances, les outils de d\u00e9veloppement et la configuration de l&rsquo;outil. Cela rend les projets plus faciles \u00e0 partager, \u00e0 cloner et \u00e0 entretenir, exactement ce dont les \u00e9quipes de recherche ont besoin lorsqu&rsquo;elles publient du code ou \u00e0 bord des nouveaux \u00e9tudiants.<\/p>\n<h2>UV : gestion des packages qui fonctionne r\u00e9ellement<\/h2>\n<p><code>uv<\/code> est un gestionnaire de packages bas\u00e9 sur la rouille construit par Astral. Il remplace PIP, PIP-Tools, PIPX, PYENV et VirtualEnv dans un seul binaire rapide. Contrairement \u00e0 PIP, <code>uv<\/code> n&rsquo;exige pas que Python soit install\u00e9 en premier&nbsp;: il peut amorcer un interpr\u00e9teur Python et g\u00e9rer les versions aux c\u00f4t\u00e9s des d\u00e9pendances.<\/p>\n<h3>Pourquoi les chercheurs changent<\/h3>\n<p>Les principales raisons pour lesquelles les chercheurs et les d\u00e9veloppeurs choisissent <code>uv<\/code>&nbsp;:<\/p>\n<ol>\n<li><strong>Vitesse<\/strong>. <code>uv<\/code> installe des packages 10 \u00e0 100&nbsp;fois plus rapidement que le PIP, principalement gr\u00e2ce \u00e0 une r\u00e9solution parall\u00e8le et \u00e0 une mise en cache agressive. Cela est important dans les pipelines CI o\u00f9 le temps d&rsquo;installation a un impact direct sur la rotation des d\u00e9veloppeurs.<\/li>\n<li><strong>Verrouiller les fichiers<\/strong>. Un seul fichier <code>uv.lock<\/code> enregistre les versions r\u00e9solues exactes de chaque d\u00e9pendance, y compris les sous-d\u00e9pendances. La validation de ce fichier dans Git rend votre environnement enti\u00e8rement reproductible, une exigence pour les simulations publi\u00e9es.<\/li>\n<li><strong>Gestion des versions de Python<\/strong>. <code>uv<\/code> peut t\u00e9l\u00e9charger et g\u00e9rer des interpr\u00e9teurs Python, \u00e9liminant ainsi le besoin d&rsquo;outils distincts comme PYENV.<\/li>\n<li><strong>Compatible PIP<\/strong>. Des commandes comme <code>uv pip install<\/code> fonctionnent avec <code>requirements.txt<\/code>, simplifiant la migration des projets existants.<\/li>\n<\/ol>\n<h3>Configuration des UV<\/h3>\n<p>Le flux de travail typique d&rsquo;un nouveau projet Python scientifique ressemble \u00e0 ceci&nbsp;:<\/p>\n<pre><code class=\"language-bash\"># Install uv (curl pipe to sh, cross-platform)\ncurl -LsSf https:\/\/astral.sh\/uv\/install.sh | sh\n\n# Create a project with a specific Python version\nuv init my-simulation --python 3.11\ncd my-simulation\n\n# Add core scientific dependencies\nuv add numpy scipy matplotlib\n\n# Add domain-specific libraries\nuv add fipy mpmath\n\n# Add development tools\nuv add --group dev pytest ruff ty\n\n# Generate and commit a lockfile\nuv lock\ngit add pyproject.toml uv.lock\ngit commit -m \"Initial project with pinned dependencies\"\n<\/code><\/pre>\n<p><code>uv sync<\/code> s&rsquo;installe \u00e0 partir du fichier de verrouillage, assurant des reproductions d\u00e9terministes. Toute personne clonant le r\u00e9f\u00e9rentiel et ex\u00e9cut\u00e9 <code>uv sync<\/code> obtient exactement les m\u00eames versions r\u00e9solues.<\/p>\n<h3>La bizarrerie de la compilation de bytecode<\/h3>\n<p>Voici o\u00f9 <code>uv<\/code> se comporte diff\u00e9remment du PIP et o\u00f9 les \u00e9quipes de calcul scientifique ont heurt\u00e9 des murs inattendus.<\/p>\n<p><code>uv<\/code> reporte la compilation de bytecode \u00e0 la premi\u00e8re ex\u00e9cution. Lorsque <code>uv<\/code> installe un package, il stocke le bytecode pr\u00e9compil\u00e9 dans un cache mais ne compile pas tous les fichiers imm\u00e9diatement. Cela rend <code>uv<\/code> les installations environ 3 \u00e0 4 fois plus rapides que PIP. Cependant, la premi\u00e8re importation d&rsquo;une biblioth\u00e8que (en particulier NumPy ou Scipy) peut \u00eatre environ 2,5 fois plus lente qu&rsquo;une copie install\u00e9e par PIP, car le bytecode est compil\u00e9 au moment de l&rsquo;importation.<\/p>\n<p>Pour le d\u00e9veloppement interactif, ce ralentissement est g\u00e9n\u00e9ralement imperceptible. Pour les pipelines CI, les scripts de travaux HPC ou les serveurs de production qui importent NumPy ou Scipy \u00e0 chaque ex\u00e9cution, la Quirk compte. Le correctif est simple&nbsp;: ajoutez <code>--compile-bytecode<\/code> \u00e0 votre commande de synchronisation.<\/p>\n<p><em>Contexte r\u00e9el&nbsp;: l&rsquo;\u00e9quipe de donn\u00e9es de Plotly a document\u00e9 ce probl\u00e8me exact apr\u00e8s avoir adopt\u00e9 <code>uv<\/code> en production. Leurs serveurs de production ont vu des importations nettement plus lentes de NumPy jusqu&rsquo;\u00e0 ce qu&rsquo;ils ajoutent le drapeau. Consultez le billet de blog de <a href=\"https:\/\/plotly.com\/blog\/uv-python-package-manager-quirks\/\" target=\"_blank\" rel=\"nofollow noopener\">Plotly sur les bizarreries UV<\/a> pour la ventilation technique compl\u00e8te.<\/em><\/p>\n<h3>Le comportement de l&rsquo;index exclusif<\/h3>\n<p><code>uv<\/code> traite <code>--extra-index-url<\/code> les entr\u00e9es comme exclusives par d\u00e9faut, apr\u00e8s PEP 0708. Cela signifie que si un package existe dans votre index principal, <code>uv<\/code> ne v\u00e9rifiera jamais l&rsquo;index suppl\u00e9mentaire pour cela. Cela prot\u00e8ge contre les attaques de d\u00e9pendance &#8211; un acteur malveillant ne peut pas remplacer un package h\u00e9berg\u00e9 sur un index bien connu par un miroir compromis. Mais cela brise \u00e9galement les pipelines existants <code>requirements.txt<\/code> qui d\u00e9pendent d&rsquo;indices suppl\u00e9mentaires pour les packages de secours.<\/p>\n<p>Si votre laboratoire utilise un index de package priv\u00e9 ou un index compatible CONDA, vous devrez configurer explicitement le <code>index-strategy<\/code> dans <code>pyproject.toml<\/code>. Sans cette configuration, <code>uv<\/code> peut ne pas r\u00e9soudre les packages qu&rsquo;il s&rsquo;attend \u00e0 trouver sur l&rsquo;index suppl\u00e9mentaire.<\/p>\n<h3>Quand les UV ne suffisent pas<\/h3>\n<p><code>uv<\/code> g\u00e8re les packages Python et les interpr\u00e8tes Python. Il ne g\u00e8re pas les d\u00e9pendances syst\u00e8me non-python : biblioth\u00e8ques C et C++, compilateurs Fortran, MPI, bo\u00eetes \u00e0 outils CUDA, HDF5, FFTW ou biblioth\u00e8ques graphiques.<\/p>\n<p>Pour ces d\u00e9pendances, Conda reste la norme. Le mod\u00e8le recommand\u00e9 consiste \u00e0 utiliser <code>uv<\/code> pour les packages Python et Conda (ou Pixi) pour les d\u00e9pendances au niveau du syst\u00e8me. De nombreuses \u00e9quipes scientifiques associent les deux outils &#8211; Conda pour la pile syst\u00e8me, <code>uv<\/code> pour la couche Python.<\/p>\n<p>Si votre projet implique des d\u00e9pendances non-Python telles que MPI, CUDA ou HDF5, consultez le guide associ\u00e9 sur <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestion des d\u00e9pendances en python scientifique<\/a>, qui couvre conda, lockfiles et quand utiliser chaque outil.<\/p>\n<h2>Ruff : le linter qui remplace six outils<\/h2>\n<p>Ruff est un linter et un formateur bas\u00e9s sur la rouille construits par Astral. Il remplace le noir (formatage), les isortes (tri de l&rsquo;importation), le floke8 (v\u00e9rification de style), le pyupgrade (suppression du code mort) et le flocage automatique (suppression de variables inutilis\u00e9es) dans un seul binaire qui s&rsquo;ex\u00e9cute 10 \u00e0 100 fois plus rapidement que l&rsquo;ancien combin\u00e9. empiler.<\/p>\n<p>Cela le rend particuli\u00e8rement attrayant pour l&rsquo;informatique scientifique, o\u00f9 de grandes bases de code avec des versions mixtes de Python et des modules h\u00e9rit\u00e9s peuvent prendre plusieurs secondes pour s&rsquo;aligner sur les outils traditionnels. Ruff le fait en quelques millisecondes.<\/p>\n<h3>Les biblioth\u00e8ques scientifiques utilisent d\u00e9j\u00e0 Ruff<\/h3>\n<p>Ruff n&rsquo;est plus seulement un linter de cadres Web. Les grandes biblioth\u00e8ques scientifiques l&rsquo;ont adopt\u00e9 :<\/p>\n<ul>\n<li><strong>Scipy<\/strong> \u2014 L&rsquo;\u00e9quipe de base de la biblioth\u00e8que de m\u00e9thodes num\u00e9riques a migr\u00e9 vers Ruff.<\/li>\n<li><strong>Pandas<\/strong> : utilise Ruff pour l&rsquo;application des styles dans toute la base de code.<\/li>\n<li><strong>Fastapi<\/strong> et <strong>visage en \u00e9treignant<\/strong> \u2014 tous deux utilisent Ruff comme seul formateur et linter.<\/li>\n<\/ul>\n<p>Cette adoption est importante car elle signale que Ruff g\u00e8re les cas de code scientifique &#8211; longues docstrings, annotations de type complexes, importations h\u00e9rit\u00e9es de style Python-2 &#8211; sans perdre l&rsquo;exactitude ni introduire de bogues de mise en forme. La documentation officielle de RUFF r\u00e9pertorie les trois biblioth\u00e8ques en tant qu&rsquo;adopteurs. Consultez la <a href=\"https:\/\/astral.sh\/ruff\/\" target=\"_blank\" rel=\"nofollow noopener\">officiel ruff docs<\/a> pour la liste compl\u00e8te.<\/p>\n<h3>Configuration<\/h3>\n<p>Ruff configure enti\u00e8rement \u00e0 partir de <code>pyproject.toml<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-toml\">[tool.ruff]\nline-length = 88\ntarget-version = \"py311\"\n\n[tool.ruff.lint]\nselect = [\"E\", \"F\", \"I\", \"N\", \"W\", \"UP\", \"RUF\"]\nignore = [\"E501\"]\n\n[tool.ruff.format]\nquote-style = \"double\"\n<\/code><\/pre>\n<p>Le tableau <code>select<\/code> sp\u00e9cifie les jeux de r\u00e8gles \u00e0 activer. <code>E<\/code> et <code>F<\/code> COVER PEP 8 Erreurs et v\u00e9rifications Pyflakes. <code>I<\/code> G\u00e8re le tri des importations (rempla\u00e7ant Isort). <code>N<\/code> Applique les conventions de d\u00e9nomination. <code>UP<\/code> Ex\u00e9cute la modernisation de style pyupgrade. <code>RUF<\/code> Ajoute des r\u00e8gles sp\u00e9cifiques \u00e0 Ruff. La ligne <code>ignore<\/code> supprime E501 (trop de ligne) car Ruff d\u00e9l\u00e8gue la longueur de ligne au formateur, en gardant la linter rapide.<\/p>\n<h3>Migration depuis le noir + l&rsquo;isort + le flocon8<\/h3>\n<p>La suppression de l&rsquo;ancienne pile est simple. Apr\u00e8s avoir install\u00e9 RUFF, vous pouvez remplacer les commandes :<\/p>\n<pre><code class=\"language-bash\"># OLD stack\nblack .\nisort .\nflake8 .\npyupgrade --py38 src\/\n\n# NEW stack\nruff check .\nruff format .\n<\/code><\/pre>\n<p><code>ruff check<\/code> G\u00e8re toutes les v\u00e9rifications de style. <code>ruff format<\/code> G\u00e8re tout le formatage. C&rsquo;est deux commandes au lieu de quatre, ex\u00e9cutant un binaire au lieu de quatre distincts.<\/p>\n<p>Le guide de d\u00e9veloppement scientifique Python recommande explicitement de migrer de Flake8 \u00e0 Ruff pour les v\u00e9rifications de style. Consultez <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">leur guide de s\u00e9curit\u00e9 et de d\u00e9veloppement<\/a> pour la recommandation officielle.<\/p>\n<h2>TY : v\u00e9rification du type sans douleur<\/h2>\n<p><code>ty<\/code> est le v\u00e9rificateur de type de nouvelle g\u00e9n\u00e9ration d&rsquo;Astral, publi\u00e9 en d\u00e9cembre 2025. Il remplace myPY en tant que v\u00e9rificateur de type statique recommand\u00e9 dans l&rsquo;\u00e9cosyst\u00e8me Astral. Il est \u00e9crit en rouille et con\u00e7u pour \u00eatre rapide, strict par d\u00e9faut et compatible avec un code non annot\u00e9.<\/p>\n<h3>La vitesse de gain<\/h3>\n<p>L&rsquo;avantage le plus spectaculaire de TY est la vitesse. Dans un benchmark du monde r\u00e9el par un utilisateur qui a migr\u00e9 de MyPy vers TY sur une base de code Python scientifique r\u00e9elle, MyPY a pris <strong>46 secondes<\/strong> et TY a effectu\u00e9 la m\u00eame v\u00e9rification en <strong>2,19 secondes<\/strong> &#8211; environ 20&nbsp;fois plus rapide. Consultez la r\u00e9f\u00e9rence compl\u00e8te dans <a href=\"https:\/\/blog.stackademic.com\/i-switched-from-mypy-to-ty-and-my-ci-type-checks-went-from-46-seconds-to-2-9a8cb1b11170\" target=\"_blank\" rel=\"nofollow noopener\">The Stackademic Migration Post<\/a>.<\/p>\n<p>Cela compte car la v\u00e9rification des types est souvent l&rsquo;\u00e9tape CI la plus longue dans un flux de travail Python. R\u00e9duire 46&nbsp;secondes \u00e0 2,2&nbsp;secondes r\u00e9duit les temps de file d&rsquo;attente des CI, permet aux d\u00e9veloppeurs d&rsquo;obtenir des commentaires plus rapides et rend la v\u00e9rification compl\u00e8te du type dans les branches o\u00f9 m\u00eame les v\u00e9rificateurs de type lents auraient \u00e9t\u00e9 ignor\u00e9s.<\/p>\n<h3>La garantie graduelle<\/h3>\n<p>Contrairement \u00e0 myPY, Ty impl\u00e9mente une <strong>garantie progressive<\/strong>&nbsp;: il ne fera pas appara\u00eetre d&rsquo;erreurs sur le code qui n&rsquo;a pas d&rsquo;annotations. Si un module contient <code>def calculate(x, y): return x + y<\/code> sans indices de type, TY le traite comme non typ\u00e9 et ne se plaint pas des annotations manquantes. Ceci est id\u00e9al pour migrer les bases de code scientifiques qui ont des modules partiellement typ\u00e9s &#8211; un mod\u00e8le commun dans le code de recherche o\u00f9 le moteur de simulation de base est tap\u00e9, mais pas les scripts d&rsquo;assistance et les ordinateurs portables.<\/p>\n<p><a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">le manuel officiel de TY<\/a> explique en d\u00e9tail la garantie progressive. Le point cl\u00e9 est que l&rsquo;ajout d&rsquo;annotations de type \u00e0 un module n&rsquo;entra\u00eene pas TY pour signaler des erreurs dans ce module. MyPy fait le contraire&nbsp;: il signale des erreurs sur toute fonction non annot\u00e9e qu&rsquo;il rencontre, ce qui casse les bases de code existantes d\u00e9pourvues d&rsquo;annotations compl\u00e8tes.<\/p>\n<h3>Conformit\u00e9 aux sp\u00e9cifications&nbsp;: le compromis<\/h3>\n<p>Voici le compromis que vous devez comprendre avant de mettre TY dans CI.<\/p>\n<p>Selon <a href=\"https:\/\/www.resumelens.org\/blog\/python\/python-type-checkers-compared\" target=\"_blank\" rel=\"nofollow noopener\">Une comparaison compl\u00e8te de MyPy, Pyright, Ty et Pyre<\/a>, la conformit\u00e9 des sp\u00e9cifications Python de Ty se situe \u00e0 environ <strong>53&nbsp;%<\/strong>, tandis que Pyright atteint environ <strong>98&nbsp;%<\/strong> et que MyPy atteint environ <strong>58&nbsp;%<\/strong>. Cela signifie que Ty ne couvre que la moiti\u00e9 des fonctionnalit\u00e9s de sp\u00e9cification de frappe, et il peut manquer des cas de bord que Pyright capture.<\/p>\n<p>Jusqu&rsquo;\u00e0 ce que TY atteigne la version&nbsp;1.0, la strat\u00e9gie CI recommand\u00e9e est une approche \u00e0 deux&nbsp;couches&nbsp;:<\/p>\n<ol>\n<li><strong>D\u00e9veloppement local<\/strong>&nbsp;: utilisez Ty pour une r\u00e9troaction rapide (v\u00e9rifications de 2&nbsp;secondes).<\/li>\n<li><strong>Pipes de CI<\/strong>&nbsp;: utilisez Pyright pour une couverture compl\u00e8te des sp\u00e9cifications (attrape les \u00e9checs de TY).<\/li>\n<\/ol>\n<p>Cela vous donne \u00e0 la fois de la rapidit\u00e9 et de l&rsquo;exactitude. Une fois que TY atteint 1,0 et que sa conformit\u00e9 aux sp\u00e9cifications s&rsquo;am\u00e9liore, vous pouvez compter uniquement sur TY pour CI.<\/p>\n<h3>Configuration<\/h3>\n<p>Ty configure \u00e0 partir de <code>pyproject.toml<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-toml\">[tool.typer]\npython-version = \"3.11\"\nstrict = true\n<\/code><\/pre>\n<p>L&rsquo;indicateur <code>strict<\/code> active toutes les v\u00e9rifications strictes du mode (colonne implicite, non-un-typ\u00e9-def, etc.). Voir <a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">Le manuel TY<\/a> pour la r\u00e9f\u00e9rence de configuration compl\u00e8te.<\/p>\n<h2>Guide de migration : de l&rsquo;ancienne pile au nouveau<\/h2>\n<p>Voici la comparaison pratique avant et apr\u00e8s. Si vous utilisez actuellement PIP, VenV, Black, Isort, Flake8 et MyPy, ce tableau montre exactement ce qui remplace chaque outil.<\/p>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>T\u00e2che<\/th>\n<th>Ancienne pile (2023 et versions ant\u00e9rieures)<\/th>\n<th>Pile moderne (2025-2026)<\/th>\n<th>notes<\/th>\n<\/tr>\n<tr>\n<td>Gestionnaire de paquets<\/td>\n<td>p\u00e9pin<\/td>\n<td>UV<\/td>\n<td>10 \u00e0 100 \u00d7 installations plus rapides, fichiers de verrouillage inclus<\/td>\n<\/tr>\n<tr>\n<td>Environnements virtuels<\/td>\n<td>Venv \/ VirtualEnv<\/td>\n<td>Int\u00e9gr\u00e9 aux UV<\/td>\n<td>UV g\u00e8re VENV automatiquement<\/td>\n<\/tr>\n<tr>\n<td>Gestion des versions Python<\/td>\n<td>Pyenv \/ pyenv-virtualenv<\/td>\n<td>Int\u00e9gr\u00e9 aux UV<\/td>\n<td>T\u00e9l\u00e9chargements UV Interpr\u00e8tes \u00e0 la demande<\/td>\n<\/tr>\n<tr>\n<td>Style peluche<\/td>\n<td>flocon8, pydocstyle<\/td>\n<td>Fraise<\/td>\n<td>Ruff remplace les deux dans un binaire<\/td>\n<\/tr>\n<tr>\n<td>mise en forme<\/td>\n<td>Noir<\/td>\n<td>RUFF (format Ruff)<\/td>\n<td>M\u00eame sortie que le noir dans la plupart des cas<\/td>\n<\/tr>\n<tr>\n<td>Importer le tri<\/td>\n<td>isorter<\/td>\n<td>Ruff (v\u00e9rification RUFF &#8211;FIX)<\/td>\n<td>int\u00e9gr\u00e9 dans les r\u00e8gles de Ruff&rsquo;s Lint<\/td>\n<\/tr>\n<tr>\n<td>V\u00e9rification des types<\/td>\n<td>mypy<\/td>\n<td>Ty (local), Pyright (CI)<\/td>\n<td>Ty est 20 \u00d7 plus rapide ; Pyright attrape Ty manque<\/td>\n<\/tr>\n<tr>\n<td>Configuration<\/td>\n<td>5+ fichiers de configuration dispers\u00e9s<\/td>\n<td>pyproject.toml unique<\/td>\n<td>Tous les outils lus \u00e0 partir d&rsquo;un fichier<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Migration \u00e9tape par \u00e9tape<\/h3>\n<p>Voici le chemin de migration concret pour un projet existant :<\/p>\n<pre><code class=\"language-bash\"># 1. Install uv and Ruff\nuv pip install uv ruff\n\n# 2. Create pyproject.toml (replacing setup.cfg)\ncat &gt;&gt; pyproject.toml &lt;&lt;EOF\n[build-system]\nrequires = [\"setuptools\"]\nbuild-backend = \"setuptools.backends._deprecated\"\n\n[project]\nname = \"my-simulation\"\nversion = \"0.1.0\"\ndependencies = [\n    \"numpy\",\n    \"scipy\",\n    \"fipy\",\n]\nEOF\n\n# 3. Add Ruff config\ncat &gt;&gt; pyproject.toml &lt;&lt;EOF\n\n[tool.ruff]\nline-length = 88\ntarget-version = \"py311\"\n\n[tool.ruff.lint]\nselect = [\"E\", \"F\", \"I\", \"N\", \"W\", \"UP\"]\nignore = [\"E501\"]\nEOF\n\n# 4. Add ty config\ncat &gt;&gt; pyproject.toml &lt;&lt;EOF\n\n[tool.typer]\npython-version = \"3.11\"\nstrict = true\nEOF\n\n# 5. Run uv sync to manage dependencies\nuv sync\n\n# 6. Run Ruff to check and format existing code\nruff check .\nruff format .\n\n# 7. Run ty locally for fast type feedback\nty check .\n<\/code><\/pre>\n<p>Ce chemin fonctionne car la sortie de Ruff est presque identique au style de mise en forme de Black, de sorte que le code format\u00e9 semble familier. La garantie graduelle de TY signifie qu&rsquo;elle ne cassera pas les modules non annot\u00e9s lors de la migration. Vous pouvez ajouter des annotations de type de mani\u00e8re incr\u00e9mentielle sans crainte d&rsquo;erreurs de surface TY sur le code que vous n&rsquo;avez pas encore tap\u00e9.<\/p>\n<p>Si votre projet s&rsquo;appuie sur <code>requirements.txt<\/code>, notez que <code>uv<\/code> peut s&rsquo;installer \u00e0 partir de <code>uv pip install -r requirements.txt<\/code>. Mais pour la reproductibilit\u00e9 \u00e0 long terme, g\u00e9n\u00e9rez un fichier <code>uv.lock<\/code> et \u00e9loignez-vous de <code>requirements.txt<\/code>. Consultez le guide connexe sur <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestion des d\u00e9pendances en Python scientifique<\/a> pour en savoir plus sur les fichiers de verrouillage et la reproductibilit\u00e9.<\/p>\n<h2>Ce que nous recommandons : un cadre de d\u00e9cision<\/h2>\n<p>Toutes les \u00e9quipes ne doivent pas adopter les trois outils simultan\u00e9ment. La bonne pile d\u00e9pend des exigences de votre projet. Utilisez ce cadre de d\u00e9cision pour choisir :<\/p>\n<ol>\n<li><strong>Avez-vous besoin de d\u00e9pendances non-Python&nbsp;?<\/strong> (MPI, CUDA, HDF5, C++, compilateurs Fortran)\n<ul>\n<li><strong>Oui<\/strong>&nbsp;: utilisez conda pour ces d\u00e9pendances. Vous pouvez toujours utiliser <code>uv<\/code> pour les packages Python aux c\u00f4t\u00e9s de Conda.<\/li>\n<li><strong>No<\/strong>&nbsp;: passez \u00e0 la question suivante.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Publiez-vous un package Python sur Pypi&nbsp;?<\/strong>\n<ul>\n<li><strong>Oui<\/strong>&nbsp;: envisagez la po\u00e9sie pour les flux de travail de publication matures, ou <code>uv<\/code> pour des installations plus rapides pendant le d\u00e9veloppement. Les deux prennent en charge la publication PYPI.<\/li>\n<li><strong>Non<\/strong>&nbsp;: <code>uv<\/code> est le choix par d\u00e9faut pour les nouveaux projets de recherche.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Travaillez-vous dans des pipelines CI\/CD l\u00e0 o\u00f9 le temps d&rsquo;installation est important&nbsp;?<\/strong>\n<ul>\n<li><strong>Oui<\/strong>&nbsp;: utilisez <code>uv<\/code>. Les gains de vitesse (10&nbsp;-100 \u00d7 sur pip) r\u00e9duisent directement les temps de file d&rsquo;attente des CI.<\/li>\n<li><strong>Non<\/strong>&nbsp;: <code>uv<\/code> ou la po\u00e9sie peut fonctionner selon la familiarit\u00e9 de l&rsquo;\u00e9quipe.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Quelle est l&rsquo;importance de la couverture compl\u00e8te des sp\u00e9cifications de type de v\u00e9rification de type dans CI&nbsp;?<\/strong>\n<ul>\n<li><strong>High<\/strong>&nbsp;: utilisez Pyright pour CI, TY pour le d\u00e9veloppement local. Cela vous donne \u00e0 la fois de la rapidit\u00e9 et de l&rsquo;exactitude.<\/li>\n<li><strong>low<\/strong>&nbsp;: Ty seul est suffisant pour la plupart des bases de code de recherche.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Pour la plupart des nouveaux projets de recherche, la pile recommand\u00e9e est :<\/p>\n<ul>\n<li><strong>UV<\/strong> pour la gestion des packages et les fichiers de verrouillage<\/li>\n<li><strong>Ruff<\/strong> pour les peluches et le formatage<\/li>\n<li><strong>TY<\/strong> pour la v\u00e9rification des types locaux (r\u00e9troaction rapide)<\/li>\n<li><strong>Pyright<\/strong> pour la v\u00e9rification du type CI (couverture compl\u00e8te des sp\u00e9cifications)<\/li>\n<\/ul>\n<p>Cette combinaison vous donne de la rapidit\u00e9, de l&rsquo;exactitude et de la reproductibilit\u00e9, les trois piliers de la qualit\u00e9 des logiciels de recherche.<\/p>\n<h2>Limitations : quand s&rsquo;en tenir aux anciens outils<\/h2>\n<p>La pile moderne est puissante, mais ce n&rsquo;est pas un remplacement universel. C&rsquo;est \u00e0 ce moment-l\u00e0 que vous devez conserver les anciens outils&nbsp;:<\/p>\n<h3>Conda pour les d\u00e9pendances non-Python<\/h3>\n<p>UV g\u00e8re les packages Python et les interpr\u00e8tes Python. Il ne g\u00e8re pas les biblioth\u00e8ques C compil\u00e9es, les compilateurs Fortran, les bo\u00eetes \u00e0 outils CUDA, HDF5, FFTW ou graphiques. Pour ceux-ci, Conda (ou Pixi) reste la norme pour le calcul scientifique. De nombreuses \u00e9quipes utilisent Conda pour les d\u00e9pendances syst\u00e8me et <code>uv<\/code> pour les packages Python dans le m\u00eame environnement.<\/p>\n<h3>myPY pour une couverture compl\u00e8te des sp\u00e9cifications<\/h3>\n<p>Jusqu&rsquo;\u00e0 ce que TY atteigne la version 1.0 et comble son espace de conformit\u00e9 des sp\u00e9cifications, MyPY ou Pyright est le choix le plus s\u00fbr pour les environnements CI n\u00e9cessitant une couverture compl\u00e8te de v\u00e9rification de type. Utilisez TY pour le d\u00e9veloppement local o\u00f9 la vitesse est importante et le Pyright (ou MyPy) pour l&rsquo;IC lorsque l&rsquo;exactitude est importante.<\/p>\n<h3>Po\u00e9sie pour l&rsquo;\u00e9dition Pypi<\/h3>\n<p>Si vous publiez des packages Scientific Python sur Pypi, Poetry a toujours des workflows de publication m\u00fbrs, des groupes de d\u00e9pendances et un pipeline de construction bien document\u00e9. <code>uv<\/code> prend en charge la publication Pypi, mais ses flux de travail sont plus r\u00e9cents et moins document\u00e9s que ceux de Poetry. Si votre \u00e9quipe valorise la documentation \u00e9tablie et les longs enregistrements de production, la po\u00e9sie peut toujours \u00eatre le meilleur choix pour la publication de votre flux de travail.<\/p>\n<h2>R\u00e9sum\u00e9 et \u00e9tapes suivantes<\/h2>\n<p>La cha\u00eene d&rsquo;outils Scientific Python a m\u00fbri. La pile aliment\u00e9e par la rouille &#8211; UV, Ruff et TY &#8211; remplace les anciens outils fragment\u00e9s par quelque chose de plus rapide, plus simple et mieux int\u00e9gr\u00e9. Voici les plats \u00e0 emporter :<\/p>\n<ol>\n<li><strong>UV<\/strong> est le gestionnaire de packages par d\u00e9faut pour les nouveaux projets. Utilisez <code>--compile-bytecode<\/code> sur les serveurs et les pipelines CI. Utilisez Conda \u00e0 ses c\u00f4t\u00e9s pour les d\u00e9pendances non Python.<\/li>\n<li><strong>Ruff<\/strong> remplace Black, Isort, Flake8, PyUpgrade et Autoflake. Scipy et Pandas l&rsquo;utilisent d\u00e9j\u00e0. Configurez tout \u00e0 partir de <code>pyproject.toml<\/code>.<\/li>\n<li><strong>ty<\/strong> est le v\u00e9rificateur de type le plus rapide disponible, 20&nbsp;\u00d7 plus rapide que MyPy. Utilisez-le localement. Utilisez Pyright pour CI jusqu&rsquo;\u00e0 ce que TY atteigne 1,0.<\/li>\n<li><strong>PyProject.toml<\/strong> est la seule source de configuration. Les trois outils lisent. Plus de fichiers de configuration dispers\u00e9s.<\/li>\n<\/ol>\n<p>Si vous lancez un nouveau projet de simulation, adoptez la pile moderne d\u00e8s le premier jour. Si vous migrez un projet existant, suivez le chemin \u00e9tape par \u00e9tape ci-dessus &#8211; la sortie de mise en forme de Ruff est presque identique \u00e0 celle de Black, et la garantie progressive de Ty signifie que vous ne cassez pas le code existant pendant la transition.<\/p>\n<p>Pour un contexte plus large sur la pile scientifique de la biblioth\u00e8que Python qui se trouve au-dessus de cet outillage, consultez le <a href=\"https:\/\/matforge.org\/scientific-python-ecosystem-navigating-scipy-numpy-sympy-2\/\" target=\"_blank\" rel=\"nofollow noopener\">Guide d&rsquo;\u00e9cosyst\u00e8me Python scientifique<\/a>, qui couvre NumPy, Scipy, Sympy, MatPlotlib, Jupyter et Apprendre le scikit. Pour une couverture plus approfondie de la gestion des d\u00e9pendances et des fichiers de verrouillage, consultez le guide <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestion des d\u00e9pendances dans Scientific Python<\/a>. Et pour les meilleures pratiques de maintenance qui se marient bien avec la cha\u00eene d&rsquo;outils moderne, lisez le guide des <a href=\"https:\/\/matforge.org\/best-practices-for-maintaining-scientific-code\/\" target=\"_blank\" rel=\"nofollow noopener\">meilleures pratiques pour maintenir le code scientifique<\/a>.<\/p>\n<p>L&rsquo;\u00e9cosyst\u00e8me scientifique de Python ne va nulle part. Mais la fa\u00e7on dont vous travaillez avec cela a chang\u00e9, et l&rsquo;adoption de la pile moderne vous offre des constructions plus rapides, une configuration plus simple et une meilleure reproductibilit\u00e9, le tout sans modifier les biblioth\u00e8ques que vous utilisez pour le calcul.<\/p>\n<p><!-- R\u00e9f\u00e9rences et lectures suppl\u00e9mentaires --><\/p>\n<h2>R\u00e9f\u00e9rences et lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/astral.sh\/ruff\/\" target=\"_blank\" rel=\"nofollow noopener\">Ruff Documentation<\/a> \u2014 Guide officiel pour le linter et le formateur bas\u00e9s sur la rouille.<\/li>\n<li><a href=\"https:\/\/github.com\/astral-sh\/uv\" target=\"_blank\" rel=\"nofollow noopener\">r\u00e9f\u00e9rentiel uv github<\/a> \u2014 code source officiel et documentation des fonctionnalit\u00e9s.<\/li>\n<li><a href=\"https:\/\/medium.com\/fhinkel\/python-packaging-in-2025-introducing-uv-a-speedy-new-contender-cbf408726687\" target=\"_blank\" rel=\"nofollow noopener\">Packaging Python en 2025&nbsp;: pr\u00e9sentation des UV<\/a> \u2014 Franziska Hinkelmann aper\u00e7u technique de la conception et de la philosophie des UV.<\/li>\n<li><a href=\"https:\/\/plotly.com\/blog\/uv-python-package-manager-quirks\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestionnaire de packages UV Python&nbsp;: bizarreries et le\u00e7ons Apprentissage<\/a> \u2014 L&rsquo;exp\u00e9rience d&rsquo;adoption dans le monde r\u00e9el de Plotly avec les UV.<\/li>\n<li><a href=\"https:\/\/www.kdnuggets.com\/python-project-setup-2026-uv-ruff-ty-polars\" target=\"_blank\" rel=\"nofollow noopener\">configuration du projet Python 2026&nbsp;: UV, Ruff, TY, Polars<\/a> &#8211; Guide de configuration \u00e9tape par \u00e9tape pour la pile moderne.<\/li>\n<li><a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">Manuel de ty<\/a> \u2014 Manuel officiel couvrant les capacit\u00e9s de TY, la garantie progressive et Int\u00e9gration du code VS.<\/li>\n<li><a href=\"https:\/\/www.resumelens.org\/blog\/python\/python-type-checkers-compared\" target=\"_blank\" rel=\"nofollow noopener\">Desseurs de type Python compar\u00e9s<\/a> &#8211; Comparaison compl\u00e8te de MyPY, Pyright, TY et Pyre avec les donn\u00e9es de conformit\u00e9 des sp\u00e9cifications.<\/li>\n<li><a href=\"https:\/\/blog.stackademic.com\/i-switched-from-mypy-to-ty-and-my-ci-type-checks-went-from-46-seconds-to-2-9a8cb1b11170\" target=\"_blank\" rel=\"nofollow noopener\">Je suis pass\u00e9 de MyPy \u00e0 TY (46s \u2192 2.19s)<\/a> \u2014 benchmark de v\u00e9rification de type dans le monde r\u00e9el sur une base de code Python scientifique.<\/li>\n<li><a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">Guide de d\u00e9veloppement scientifique Python<\/a> \u2014 Recommandations officielles de la communaut\u00e9 pour Ruff et TY.<\/li>\n<\/ul>\n","protected":false,"raw":"<h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li><strong>UV<\/strong> est devenu le gestionnaire de packages Python par d\u00e9faut pour le calcul scientifique - 10 \u00e0 100 fois plus rapide que le PIP, avec des fichiers de verrouillage d\u00e9terministes qui rendent la production de flux de travail de recherche reproductible.<\/li>\n<li><strong>Ruff<\/strong> remplace le noir, l'isort, le flake8, le pyupgrade et le flocon automatique dans un seul binaire bas\u00e9 sur la rouille. Scipy, Pandas et d'autres biblioth\u00e8ques scientifiques majeures l'utilisent aujourd'hui.<\/li>\n<li><strong>ty<\/strong> (publi\u00e9 en d\u00e9cembre&nbsp;2025) est 20 \u00e0 100&nbsp;fois plus rapide que MyPY et utilise une garantie progressive qui ne cassera pas le code non annot\u00e9, id\u00e9al pour migrer les bases de code de recherche.<\/li>\n<li><strong>PyProject.toml<\/strong> est d\u00e9sormais la source unique de configuration de l'ensemble de la cha\u00eene d'outils, rempla\u00e7ant les fichiers de configuration dispers\u00e9s comme <code>.flake8<\/code>, <code>.isort.cfg<\/code> et <code>mypy.ini<\/code>.<\/li>\n<li><strong>Pour le calcul scientifique en particulier<\/strong>, Conda reste n\u00e9cessaire pour les d\u00e9pendances non-Python (MPI, CUDA, HDF5), et Pyright est toujours le choix le plus s\u00fbr jusqu'\u00e0 ce que TY atteigne la version&nbsp;1.0.<\/li>\n<\/ul>\n<p>Si vous ex\u00e9cutez des flux de travail Scientific Python en 2026, votre cha\u00eene d'outils a fondamentalement chang\u00e9. Les packages que vous utilisez pour le calcul - numpy, scipy, fipy et le reste - sont les m\u00eames. Mais la fa\u00e7on dont vous les installez, les g\u00e9rez, les peluches et les types de v\u00e9rification est diff\u00e9rente de ce que la plupart des didacticiels, des guides plus anciens et des ordinateurs portables universitaires recommandent encore.<\/p>\n<p>Astral, la soci\u00e9t\u00e9 derri\u00e8re Python le plus populaire de Python (Ruff), a cr\u00e9\u00e9 trois outils qui couvrent d\u00e9sormais l'ensemble du flux de travail des d\u00e9veloppeurs&nbsp;: <strong>UV<\/strong> pour la gestion des packages, <strong>Ruff<\/strong> pour le peluche et la mise en forme, et <strong>ty<\/strong> Pour la v\u00e9rification du type. Ensemble, ils remplacent Pip, Venv, Black, Isort, Flake8 et MyPy. C'est six outils r\u00e9duits en trois, tous configur\u00e9s \u00e0 partir d'un seul fichier <code>pyproject.toml<\/code>.<\/p>\n<p>Cet article couvre la cha\u00eene d'outils Python scientifique moderne en 2026. Il explique ce que fait chaque outil, pourquoi le changement s'est produit et comment tout configurer, y compris les bizarreries et les limitations qui comptent pour le calcul scientifique. Si vous configurez un nouveau projet de simulation, migrez une base de code existante ou rattrapez votre retard apr\u00e8s le guide \"Scientific Python Ecosystem\" (voir article <a href=\"https:\/\/matforge.org\/scientific-python-ecosystem-navigating-scipy-numpy-sympy-2\/\">#364<\/a>), c'est la mise \u00e0 jour pratique dont vous avez besoin.<\/p>\n<h2>Le paysage de l'outillage moderne<\/h2>\n<p>Jusqu'en 2024 environ, le flux de travail du d\u00e9veloppeur Scientific Python ressemblait \u00e0 ceci&nbsp;:<\/p>\n<ul>\n<li><strong>Gestion de packages<\/strong>&nbsp;: PIP avec PIP-Tools ou Poetry<\/li>\n<li><strong>Environnements virtuels<\/strong>&nbsp;: VENV ou VirtualEnv<\/li>\n<li><strong>Gestion des versions de Python<\/strong>&nbsp;: pyenv ou pyenv-virtualenv<\/li>\n<li><strong>Linting<\/strong>&nbsp;: flake8, puis pydocstyle, plus pylint pour les v\u00e9rifications de style<\/li>\n<li><strong>Formatage<\/strong>&nbsp;: noir et Isort (et plus tard, Autopep8 et PyUpgrade)<\/li>\n<li><strong>V\u00e9rification des types<\/strong>&nbsp;: myPy<\/li>\n<\/ul>\n<p>Cela signifiait installer six packages Python distincts, maintenir des fichiers de configuration distincts et attendre des \u00e9tapes de r\u00e9solution s\u00e9quentielles. Un simple <code>pip install<\/code> pourrait prendre quelques minutes. Running Black, puis Isort, puis Flake8, alors MyPy pourrait prendre encore plus de temps.<\/p>\n<p>Le quart de travail a commenc\u00e9 lorsqu'Astral a sorti Ruff en 2023. Ruff a \u00e9t\u00e9 \u00e9crit dans Rust, con\u00e7u pour remplacer simultan\u00e9ment Black, Isort, Flake8, PyUpgrade et Autoflake, et a couru des ordres de grandeur plus rapidement que les alternatives bas\u00e9es sur Python. Ce succ\u00e8s d'adoption a donn\u00e9 \u00e0 Astral l'\u00e9lan n\u00e9cessaire pour construire un \u00e9cosyst\u00e8me complet&nbsp;: les UV pour la gestion des paquets et la v\u00e9rification des types.<\/p>\n<p>Fin 2025 et d\u00e9but 2026, la convergence \u00e9tait compl\u00e8te. Le <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">Guide de d\u00e9veloppement scientifique Python<\/a> recommande d\u00e9sormais officiellement Ruff Pour les v\u00e9rifications de style et TY pour la v\u00e9rification du type. Scipy et Pandas ont adopt\u00e9 Ruff. UV a d\u00e9pass\u00e9 la po\u00e9sie dans l'adoption au sein des \u00e9quipes de calcul scientifique. L'ancienne pile n'est pas morte - elle fonctionne toujours - mais ce n'est plus la valeur par d\u00e9faut pour les nouveaux projets.<\/p>\n<h3>Pourquoi pyproject.toml est important<\/h3>\n<p>L'un des changements pratiques les plus importants est le mod\u00e8le de configuration. L'ancienne configuration dispers\u00e9e de la pile dans cinq fichiers ou plus&nbsp;:<\/p>\n<ul>\n<li><code>.flake8<\/code> pour les r\u00e8gles de peluche<\/li>\n<li><code>.isort.cfg<\/code> pour le tri des importations<\/li>\n<li><code>mypy.ini<\/code> pour le comportement de v\u00e9rification de type<\/li>\n<li><code>setup.cfg<\/code> pour les m\u00e9tadonn\u00e9es du package<\/li>\n<li><code>pyproject.toml<\/code> (partiellement, pour les syst\u00e8mes de construction)<\/li>\n<\/ul>\n<p>L'outillage moderne centralise tout dans <code>pyproject.toml<\/code>. Un seul fichier d\u00e9finit le package, les d\u00e9pendances, les outils de d\u00e9veloppement et la configuration de l'outil. Cela rend les projets plus faciles \u00e0 partager, \u00e0 cloner et \u00e0 entretenir, exactement ce dont les \u00e9quipes de recherche ont besoin lorsqu'elles publient du code ou \u00e0 bord des nouveaux \u00e9tudiants.<\/p>\n<h2>UV : gestion des packages qui fonctionne r\u00e9ellement<\/h2>\n<p><code>uv<\/code> est un gestionnaire de packages bas\u00e9 sur la rouille construit par Astral. Il remplace PIP, PIP-Tools, PIPX, PYENV et VirtualEnv dans un seul binaire rapide. Contrairement \u00e0 PIP, <code>uv<\/code> n'exige pas que Python soit install\u00e9 en premier&nbsp;: il peut amorcer un interpr\u00e9teur Python et g\u00e9rer les versions aux c\u00f4t\u00e9s des d\u00e9pendances.<\/p>\n<h3>Pourquoi les chercheurs changent<\/h3>\n<p>Les principales raisons pour lesquelles les chercheurs et les d\u00e9veloppeurs choisissent <code>uv<\/code>&nbsp;:<\/p>\n<ol>\n<li><strong>Vitesse<\/strong>. <code>uv<\/code> installe des packages 10 \u00e0 100&nbsp;fois plus rapidement que le PIP, principalement gr\u00e2ce \u00e0 une r\u00e9solution parall\u00e8le et \u00e0 une mise en cache agressive. Cela est important dans les pipelines CI o\u00f9 le temps d'installation a un impact direct sur la rotation des d\u00e9veloppeurs.<\/li>\n<li><strong>Verrouiller les fichiers<\/strong>. Un seul fichier <code>uv.lock<\/code> enregistre les versions r\u00e9solues exactes de chaque d\u00e9pendance, y compris les sous-d\u00e9pendances. La validation de ce fichier dans Git rend votre environnement enti\u00e8rement reproductible, une exigence pour les simulations publi\u00e9es.<\/li>\n<li><strong>Gestion des versions de Python<\/strong>. <code>uv<\/code> peut t\u00e9l\u00e9charger et g\u00e9rer des interpr\u00e9teurs Python, \u00e9liminant ainsi le besoin d'outils distincts comme PYENV.<\/li>\n<li><strong>Compatible PIP<\/strong>. Des commandes comme <code>uv pip install<\/code> fonctionnent avec <code>requirements.txt<\/code>, simplifiant la migration des projets existants.<\/li>\n<\/ol>\n<h3>Configuration des UV<\/h3>\n<p>Le flux de travail typique d'un nouveau projet Python scientifique ressemble \u00e0 ceci&nbsp;:<\/p>\n<pre><code class=\"language-bash\"># Install uv (curl pipe to sh, cross-platform)\ncurl -LsSf https:\/\/astral.sh\/uv\/install.sh | sh\n\n# Create a project with a specific Python version\nuv init my-simulation --python 3.11\ncd my-simulation\n\n# Add core scientific dependencies\nuv add numpy scipy matplotlib\n\n# Add domain-specific libraries\nuv add fipy mpmath\n\n# Add development tools\nuv add --group dev pytest ruff ty\n\n# Generate and commit a lockfile\nuv lock\ngit add pyproject.toml uv.lock\ngit commit -m \"Initial project with pinned dependencies\"\n<\/code><\/pre>\n<p><code>uv sync<\/code> s'installe \u00e0 partir du fichier de verrouillage, assurant des reproductions d\u00e9terministes. Toute personne clonant le r\u00e9f\u00e9rentiel et ex\u00e9cut\u00e9 <code>uv sync<\/code> obtient exactement les m\u00eames versions r\u00e9solues.<\/p>\n<h3>La bizarrerie de la compilation de bytecode<\/h3>\n<p>Voici o\u00f9 <code>uv<\/code> se comporte diff\u00e9remment du PIP et o\u00f9 les \u00e9quipes de calcul scientifique ont heurt\u00e9 des murs inattendus.<\/p>\n<p><code>uv<\/code> reporte la compilation de bytecode \u00e0 la premi\u00e8re ex\u00e9cution. Lorsque <code>uv<\/code> installe un package, il stocke le bytecode pr\u00e9compil\u00e9 dans un cache mais ne compile pas tous les fichiers imm\u00e9diatement. Cela rend <code>uv<\/code> les installations environ 3 \u00e0 4 fois plus rapides que PIP. Cependant, la premi\u00e8re importation d'une biblioth\u00e8que (en particulier NumPy ou Scipy) peut \u00eatre environ 2,5 fois plus lente qu'une copie install\u00e9e par PIP, car le bytecode est compil\u00e9 au moment de l'importation.<\/p>\n<p>Pour le d\u00e9veloppement interactif, ce ralentissement est g\u00e9n\u00e9ralement imperceptible. Pour les pipelines CI, les scripts de travaux HPC ou les serveurs de production qui importent NumPy ou Scipy \u00e0 chaque ex\u00e9cution, la Quirk compte. Le correctif est simple&nbsp;: ajoutez <code>--compile-bytecode<\/code> \u00e0 votre commande de synchronisation.<\/p>\n<p><em>Contexte r\u00e9el&nbsp;: l'\u00e9quipe de donn\u00e9es de Plotly a document\u00e9 ce probl\u00e8me exact apr\u00e8s avoir adopt\u00e9 <code>uv<\/code> en production. Leurs serveurs de production ont vu des importations nettement plus lentes de NumPy jusqu'\u00e0 ce qu'ils ajoutent le drapeau. Consultez le billet de blog de <a href=\"https:\/\/plotly.com\/blog\/uv-python-package-manager-quirks\/\" target=\"_blank\" rel=\"nofollow noopener\">Plotly sur les bizarreries UV<\/a> pour la ventilation technique compl\u00e8te.<\/em><\/p>\n<h3>Le comportement de l'index exclusif<\/h3>\n<p><code>uv<\/code> traite <code>--extra-index-url<\/code> les entr\u00e9es comme exclusives par d\u00e9faut, apr\u00e8s PEP 0708. Cela signifie que si un package existe dans votre index principal, <code>uv<\/code> ne v\u00e9rifiera jamais l'index suppl\u00e9mentaire pour cela. Cela prot\u00e8ge contre les attaques de d\u00e9pendance - un acteur malveillant ne peut pas remplacer un package h\u00e9berg\u00e9 sur un index bien connu par un miroir compromis. Mais cela brise \u00e9galement les pipelines existants <code>requirements.txt<\/code> qui d\u00e9pendent d'indices suppl\u00e9mentaires pour les packages de secours.<\/p>\n<p>Si votre laboratoire utilise un index de package priv\u00e9 ou un index compatible CONDA, vous devrez configurer explicitement le <code>index-strategy<\/code> dans <code>pyproject.toml<\/code>. Sans cette configuration, <code>uv<\/code> peut ne pas r\u00e9soudre les packages qu'il s'attend \u00e0 trouver sur l'index suppl\u00e9mentaire.<\/p>\n<h3>Quand les UV ne suffisent pas<\/h3>\n<p><code>uv<\/code> g\u00e8re les packages Python et les interpr\u00e8tes Python. Il ne g\u00e8re pas les d\u00e9pendances syst\u00e8me non-python : biblioth\u00e8ques C et C++, compilateurs Fortran, MPI, bo\u00eetes \u00e0 outils CUDA, HDF5, FFTW ou biblioth\u00e8ques graphiques.<\/p>\n<p>Pour ces d\u00e9pendances, Conda reste la norme. Le mod\u00e8le recommand\u00e9 consiste \u00e0 utiliser <code>uv<\/code> pour les packages Python et Conda (ou Pixi) pour les d\u00e9pendances au niveau du syst\u00e8me. De nombreuses \u00e9quipes scientifiques associent les deux outils - Conda pour la pile syst\u00e8me, <code>uv<\/code> pour la couche Python.<\/p>\n<p>Si votre projet implique des d\u00e9pendances non-Python telles que MPI, CUDA ou HDF5, consultez le guide associ\u00e9 sur <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestion des d\u00e9pendances en python scientifique<\/a>, qui couvre conda, lockfiles et quand utiliser chaque outil.<\/p>\n<h2>Ruff : le linter qui remplace six outils<\/h2>\n<p>Ruff est un linter et un formateur bas\u00e9s sur la rouille construits par Astral. Il remplace le noir (formatage), les isortes (tri de l'importation), le floke8 (v\u00e9rification de style), le pyupgrade (suppression du code mort) et le flocage automatique (suppression de variables inutilis\u00e9es) dans un seul binaire qui s'ex\u00e9cute 10 \u00e0 100 fois plus rapidement que l'ancien combin\u00e9. empiler.<\/p>\n<p>Cela le rend particuli\u00e8rement attrayant pour l'informatique scientifique, o\u00f9 de grandes bases de code avec des versions mixtes de Python et des modules h\u00e9rit\u00e9s peuvent prendre plusieurs secondes pour s'aligner sur les outils traditionnels. Ruff le fait en quelques millisecondes.<\/p>\n<h3>Les biblioth\u00e8ques scientifiques utilisent d\u00e9j\u00e0 Ruff<\/h3>\n<p>Ruff n'est plus seulement un linter de cadres Web. Les grandes biblioth\u00e8ques scientifiques l'ont adopt\u00e9 :<\/p>\n<ul>\n<li><strong>Scipy<\/strong> \u2014 L'\u00e9quipe de base de la biblioth\u00e8que de m\u00e9thodes num\u00e9riques a migr\u00e9 vers Ruff.<\/li>\n<li><strong>Pandas<\/strong> : utilise Ruff pour l'application des styles dans toute la base de code.<\/li>\n<li><strong>Fastapi<\/strong> et <strong>visage en \u00e9treignant<\/strong> \u2014 tous deux utilisent Ruff comme seul formateur et linter.<\/li>\n<\/ul>\n<p>Cette adoption est importante car elle signale que Ruff g\u00e8re les cas de code scientifique - longues docstrings, annotations de type complexes, importations h\u00e9rit\u00e9es de style Python-2 - sans perdre l'exactitude ni introduire de bogues de mise en forme. La documentation officielle de RUFF r\u00e9pertorie les trois biblioth\u00e8ques en tant qu'adopteurs. Consultez la <a href=\"https:\/\/astral.sh\/ruff\/\" target=\"_blank\" rel=\"nofollow noopener\">officiel ruff docs<\/a> pour la liste compl\u00e8te.<\/p>\n<h3>Configuration<\/h3>\n<p>Ruff configure enti\u00e8rement \u00e0 partir de <code>pyproject.toml<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-toml\">[tool.ruff]\nline-length = 88\ntarget-version = \"py311\"\n\n[tool.ruff.lint]\nselect = [\"E\", \"F\", \"I\", \"N\", \"W\", \"UP\", \"RUF\"]\nignore = [\"E501\"]\n\n[tool.ruff.format]\nquote-style = \"double\"\n<\/code><\/pre>\n<p>Le tableau <code>select<\/code> sp\u00e9cifie les jeux de r\u00e8gles \u00e0 activer. <code>E<\/code> et <code>F<\/code> COVER PEP 8 Erreurs et v\u00e9rifications Pyflakes. <code>I<\/code> G\u00e8re le tri des importations (rempla\u00e7ant Isort). <code>N<\/code> Applique les conventions de d\u00e9nomination. <code>UP<\/code> Ex\u00e9cute la modernisation de style pyupgrade. <code>RUF<\/code> Ajoute des r\u00e8gles sp\u00e9cifiques \u00e0 Ruff. La ligne <code>ignore<\/code> supprime E501 (trop de ligne) car Ruff d\u00e9l\u00e8gue la longueur de ligne au formateur, en gardant la linter rapide.<\/p>\n<h3>Migration depuis le noir + l'isort + le flocon8<\/h3>\n<p>La suppression de l'ancienne pile est simple. Apr\u00e8s avoir install\u00e9 RUFF, vous pouvez remplacer les commandes :<\/p>\n<pre><code class=\"language-bash\"># OLD stack\nblack .\nisort .\nflake8 .\npyupgrade --py38 src\/\n\n# NEW stack\nruff check .\nruff format .\n<\/code><\/pre>\n<p><code>ruff check<\/code> G\u00e8re toutes les v\u00e9rifications de style. <code>ruff format<\/code> G\u00e8re tout le formatage. C'est deux commandes au lieu de quatre, ex\u00e9cutant un binaire au lieu de quatre distincts.<\/p>\n<p>Le guide de d\u00e9veloppement scientifique Python recommande explicitement de migrer de Flake8 \u00e0 Ruff pour les v\u00e9rifications de style. Consultez <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">leur guide de s\u00e9curit\u00e9 et de d\u00e9veloppement<\/a> pour la recommandation officielle.<\/p>\n<h2>TY : v\u00e9rification du type sans douleur<\/h2>\n<p><code>ty<\/code> est le v\u00e9rificateur de type de nouvelle g\u00e9n\u00e9ration d'Astral, publi\u00e9 en d\u00e9cembre 2025. Il remplace myPY en tant que v\u00e9rificateur de type statique recommand\u00e9 dans l'\u00e9cosyst\u00e8me Astral. Il est \u00e9crit en rouille et con\u00e7u pour \u00eatre rapide, strict par d\u00e9faut et compatible avec un code non annot\u00e9.<\/p>\n<h3>La vitesse de gain<\/h3>\n<p>L'avantage le plus spectaculaire de TY est la vitesse. Dans un benchmark du monde r\u00e9el par un utilisateur qui a migr\u00e9 de MyPy vers TY sur une base de code Python scientifique r\u00e9elle, MyPY a pris <strong>46 secondes<\/strong> et TY a effectu\u00e9 la m\u00eame v\u00e9rification en <strong>2,19 secondes<\/strong> - environ 20&nbsp;fois plus rapide. Consultez la r\u00e9f\u00e9rence compl\u00e8te dans <a href=\"https:\/\/blog.stackademic.com\/i-switched-from-mypy-to-ty-and-my-ci-type-checks-went-from-46-seconds-to-2-9a8cb1b11170\" target=\"_blank\" rel=\"nofollow noopener\">The Stackademic Migration Post<\/a>.<\/p>\n<p>Cela compte car la v\u00e9rification des types est souvent l'\u00e9tape CI la plus longue dans un flux de travail Python. R\u00e9duire 46&nbsp;secondes \u00e0 2,2&nbsp;secondes r\u00e9duit les temps de file d'attente des CI, permet aux d\u00e9veloppeurs d'obtenir des commentaires plus rapides et rend la v\u00e9rification compl\u00e8te du type dans les branches o\u00f9 m\u00eame les v\u00e9rificateurs de type lents auraient \u00e9t\u00e9 ignor\u00e9s.<\/p>\n<h3>La garantie graduelle<\/h3>\n<p>Contrairement \u00e0 myPY, Ty impl\u00e9mente une <strong>garantie progressive<\/strong>&nbsp;: il ne fera pas appara\u00eetre d'erreurs sur le code qui n'a pas d'annotations. Si un module contient <code>def calculate(x, y): return x + y<\/code> sans indices de type, TY le traite comme non typ\u00e9 et ne se plaint pas des annotations manquantes. Ceci est id\u00e9al pour migrer les bases de code scientifiques qui ont des modules partiellement typ\u00e9s - un mod\u00e8le commun dans le code de recherche o\u00f9 le moteur de simulation de base est tap\u00e9, mais pas les scripts d'assistance et les ordinateurs portables.<\/p>\n<p><a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">le manuel officiel de TY<\/a> explique en d\u00e9tail la garantie progressive. Le point cl\u00e9 est que l'ajout d'annotations de type \u00e0 un module n'entra\u00eene pas TY pour signaler des erreurs dans ce module. MyPy fait le contraire&nbsp;: il signale des erreurs sur toute fonction non annot\u00e9e qu'il rencontre, ce qui casse les bases de code existantes d\u00e9pourvues d'annotations compl\u00e8tes.<\/p>\n<h3>Conformit\u00e9 aux sp\u00e9cifications&nbsp;: le compromis<\/h3>\n<p>Voici le compromis que vous devez comprendre avant de mettre TY dans CI.<\/p>\n<p>Selon <a href=\"https:\/\/www.resumelens.org\/blog\/python\/python-type-checkers-compared\" target=\"_blank\" rel=\"nofollow noopener\">Une comparaison compl\u00e8te de MyPy, Pyright, Ty et Pyre<\/a>, la conformit\u00e9 des sp\u00e9cifications Python de Ty se situe \u00e0 environ <strong>53&nbsp;%<\/strong>, tandis que Pyright atteint environ <strong>98&nbsp;%<\/strong> et que MyPy atteint environ <strong>58&nbsp;%<\/strong>. Cela signifie que Ty ne couvre que la moiti\u00e9 des fonctionnalit\u00e9s de sp\u00e9cification de frappe, et il peut manquer des cas de bord que Pyright capture.<\/p>\n<p>Jusqu'\u00e0 ce que TY atteigne la version&nbsp;1.0, la strat\u00e9gie CI recommand\u00e9e est une approche \u00e0 deux&nbsp;couches&nbsp;:<\/p>\n<ol>\n<li><strong>D\u00e9veloppement local<\/strong>&nbsp;: utilisez Ty pour une r\u00e9troaction rapide (v\u00e9rifications de 2&nbsp;secondes).<\/li>\n<li><strong>Pipes de CI<\/strong>&nbsp;: utilisez Pyright pour une couverture compl\u00e8te des sp\u00e9cifications (attrape les \u00e9checs de TY).<\/li>\n<\/ol>\n<p>Cela vous donne \u00e0 la fois de la rapidit\u00e9 et de l'exactitude. Une fois que TY atteint 1,0 et que sa conformit\u00e9 aux sp\u00e9cifications s'am\u00e9liore, vous pouvez compter uniquement sur TY pour CI.<\/p>\n<h3>Configuration<\/h3>\n<p>Ty configure \u00e0 partir de <code>pyproject.toml<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-toml\">[tool.typer]\npython-version = \"3.11\"\nstrict = true\n<\/code><\/pre>\n<p>L'indicateur <code>strict<\/code> active toutes les v\u00e9rifications strictes du mode (colonne implicite, non-un-typ\u00e9-def, etc.). Voir <a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">Le manuel TY<\/a> pour la r\u00e9f\u00e9rence de configuration compl\u00e8te.<\/p>\n<h2>Guide de migration : de l'ancienne pile au nouveau<\/h2>\n<p>Voici la comparaison pratique avant et apr\u00e8s. Si vous utilisez actuellement PIP, VenV, Black, Isort, Flake8 et MyPy, ce tableau montre exactement ce qui remplace chaque outil.<\/p>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>T\u00e2che<\/th>\n<th>Ancienne pile (2023 et versions ant\u00e9rieures)<\/th>\n<th>Pile moderne (2025-2026)<\/th>\n<th>notes<\/th>\n<\/tr>\n<tr>\n<td>Gestionnaire de paquets<\/td>\n<td>p\u00e9pin<\/td>\n<td>UV<\/td>\n<td>10 \u00e0 100 \u00d7 installations plus rapides, fichiers de verrouillage inclus<\/td>\n<\/tr>\n<tr>\n<td>Environnements virtuels<\/td>\n<td>Venv \/ VirtualEnv<\/td>\n<td>Int\u00e9gr\u00e9 aux UV<\/td>\n<td>UV g\u00e8re VENV automatiquement<\/td>\n<\/tr>\n<tr>\n<td>Gestion des versions Python<\/td>\n<td>Pyenv \/ pyenv-virtualenv<\/td>\n<td>Int\u00e9gr\u00e9 aux UV<\/td>\n<td>T\u00e9l\u00e9chargements UV Interpr\u00e8tes \u00e0 la demande<\/td>\n<\/tr>\n<tr>\n<td>Style peluche<\/td>\n<td>flocon8, pydocstyle<\/td>\n<td>Fraise<\/td>\n<td>Ruff remplace les deux dans un binaire<\/td>\n<\/tr>\n<tr>\n<td>mise en forme<\/td>\n<td>Noir<\/td>\n<td>RUFF (format Ruff)<\/td>\n<td>M\u00eame sortie que le noir dans la plupart des cas<\/td>\n<\/tr>\n<tr>\n<td>Importer le tri<\/td>\n<td>isorter<\/td>\n<td>Ruff (v\u00e9rification RUFF --FIX)<\/td>\n<td>int\u00e9gr\u00e9 dans les r\u00e8gles de Ruff's Lint<\/td>\n<\/tr>\n<tr>\n<td>V\u00e9rification des types<\/td>\n<td>mypy<\/td>\n<td>Ty (local), Pyright (CI)<\/td>\n<td>Ty est 20 \u00d7 plus rapide ; Pyright attrape Ty manque<\/td>\n<\/tr>\n<tr>\n<td>Configuration<\/td>\n<td>5+ fichiers de configuration dispers\u00e9s<\/td>\n<td>pyproject.toml unique<\/td>\n<td>Tous les outils lus \u00e0 partir d'un fichier<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Migration \u00e9tape par \u00e9tape<\/h3>\n<p>Voici le chemin de migration concret pour un projet existant :<\/p>\n<pre><code class=\"language-bash\"># 1. Install uv and Ruff\nuv pip install uv ruff\n\n# 2. Create pyproject.toml (replacing setup.cfg)\ncat &gt;&gt; pyproject.toml &lt;&lt;EOF\n[build-system]\nrequires = [\"setuptools\"]\nbuild-backend = \"setuptools.backends._deprecated\"\n\n[project]\nname = \"my-simulation\"\nversion = \"0.1.0\"\ndependencies = [\n    \"numpy\",\n    \"scipy\",\n    \"fipy\",\n]\nEOF\n\n# 3. Add Ruff config\ncat &gt;&gt; pyproject.toml &lt;&lt;EOF\n\n[tool.ruff]\nline-length = 88\ntarget-version = \"py311\"\n\n[tool.ruff.lint]\nselect = [\"E\", \"F\", \"I\", \"N\", \"W\", \"UP\"]\nignore = [\"E501\"]\nEOF\n\n# 4. Add ty config\ncat &gt;&gt; pyproject.toml &lt;&lt;EOF\n\n[tool.typer]\npython-version = \"3.11\"\nstrict = true\nEOF\n\n# 5. Run uv sync to manage dependencies\nuv sync\n\n# 6. Run Ruff to check and format existing code\nruff check .\nruff format .\n\n# 7. Run ty locally for fast type feedback\nty check .\n<\/code><\/pre>\n<p>Ce chemin fonctionne car la sortie de Ruff est presque identique au style de mise en forme de Black, de sorte que le code format\u00e9 semble familier. La garantie graduelle de TY signifie qu'elle ne cassera pas les modules non annot\u00e9s lors de la migration. Vous pouvez ajouter des annotations de type de mani\u00e8re incr\u00e9mentielle sans crainte d'erreurs de surface TY sur le code que vous n'avez pas encore tap\u00e9.<\/p>\n<p>Si votre projet s'appuie sur <code>requirements.txt<\/code>, notez que <code>uv<\/code> peut s'installer \u00e0 partir de <code>uv pip install -r requirements.txt<\/code>. Mais pour la reproductibilit\u00e9 \u00e0 long terme, g\u00e9n\u00e9rez un fichier <code>uv.lock<\/code> et \u00e9loignez-vous de <code>requirements.txt<\/code>. Consultez le guide connexe sur <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestion des d\u00e9pendances en Python scientifique<\/a> pour en savoir plus sur les fichiers de verrouillage et la reproductibilit\u00e9.<\/p>\n<h2>Ce que nous recommandons : un cadre de d\u00e9cision<\/h2>\n<p>Toutes les \u00e9quipes ne doivent pas adopter les trois outils simultan\u00e9ment. La bonne pile d\u00e9pend des exigences de votre projet. Utilisez ce cadre de d\u00e9cision pour choisir :<\/p>\n<ol>\n<li><strong>Avez-vous besoin de d\u00e9pendances non-Python&nbsp;?<\/strong> (MPI, CUDA, HDF5, C++, compilateurs Fortran) <ul> <li><strong>Oui<\/strong>&nbsp;: utilisez conda pour ces d\u00e9pendances. Vous pouvez toujours utiliser <code>uv<\/code> pour les packages Python aux c\u00f4t\u00e9s de Conda.<\/li> <li><strong>No<\/strong>&nbsp;: passez \u00e0 la question suivante.<\/li> <\/ul><\/li>\n<li><strong>Publiez-vous un package Python sur Pypi&nbsp;?<\/strong> <ul> <li><strong>Oui<\/strong>&nbsp;: envisagez la po\u00e9sie pour les flux de travail de publication matures, ou <code>uv<\/code> pour des installations plus rapides pendant le d\u00e9veloppement. Les deux prennent en charge la publication PYPI.<\/li> <li><strong>Non<\/strong>&nbsp;: <code>uv<\/code> est le choix par d\u00e9faut pour les nouveaux projets de recherche.<\/li> <\/ul><\/li>\n<li><strong>Travaillez-vous dans des pipelines CI\/CD l\u00e0 o\u00f9 le temps d'installation est important&nbsp;?<\/strong> <ul> <li><strong>Oui<\/strong>&nbsp;: utilisez <code>uv<\/code>. Les gains de vitesse (10&nbsp;-100 \u00d7 sur pip) r\u00e9duisent directement les temps de file d'attente des CI.<\/li> <li><strong>Non<\/strong>&nbsp;: <code>uv<\/code> ou la po\u00e9sie peut fonctionner selon la familiarit\u00e9 de l'\u00e9quipe.<\/li> <\/ul><\/li>\n<li><strong>Quelle est l'importance de la couverture compl\u00e8te des sp\u00e9cifications de type de v\u00e9rification de type dans CI&nbsp;?<\/strong> <ul> <li><strong>High<\/strong>&nbsp;: utilisez Pyright pour CI, TY pour le d\u00e9veloppement local. Cela vous donne \u00e0 la fois de la rapidit\u00e9 et de l'exactitude.<\/li> <li><strong>low<\/strong>&nbsp;: Ty seul est suffisant pour la plupart des bases de code de recherche.<\/li> <\/ul><\/li>\n<\/ol>\n<p>Pour la plupart des nouveaux projets de recherche, la pile recommand\u00e9e est :<\/p>\n<ul>\n<li><strong>UV<\/strong> pour la gestion des packages et les fichiers de verrouillage<\/li>\n<li><strong>Ruff<\/strong> pour les peluches et le formatage<\/li>\n<li><strong>TY<\/strong> pour la v\u00e9rification des types locaux (r\u00e9troaction rapide)<\/li>\n<li><strong>Pyright<\/strong> pour la v\u00e9rification du type CI (couverture compl\u00e8te des sp\u00e9cifications)<\/li>\n<\/ul>\n<p>Cette combinaison vous donne de la rapidit\u00e9, de l'exactitude et de la reproductibilit\u00e9, les trois piliers de la qualit\u00e9 des logiciels de recherche.<\/p>\n<h2>Limitations : quand s'en tenir aux anciens outils<\/h2>\n<p>La pile moderne est puissante, mais ce n'est pas un remplacement universel. C'est \u00e0 ce moment-l\u00e0 que vous devez conserver les anciens outils&nbsp;:<\/p>\n<h3>Conda pour les d\u00e9pendances non-Python<\/h3>\n<p>UV g\u00e8re les packages Python et les interpr\u00e8tes Python. Il ne g\u00e8re pas les biblioth\u00e8ques C compil\u00e9es, les compilateurs Fortran, les bo\u00eetes \u00e0 outils CUDA, HDF5, FFTW ou graphiques. Pour ceux-ci, Conda (ou Pixi) reste la norme pour le calcul scientifique. De nombreuses \u00e9quipes utilisent Conda pour les d\u00e9pendances syst\u00e8me et <code>uv<\/code> pour les packages Python dans le m\u00eame environnement.<\/p>\n<h3>myPY pour une couverture compl\u00e8te des sp\u00e9cifications<\/h3>\n<p>Jusqu'\u00e0 ce que TY atteigne la version 1.0 et comble son espace de conformit\u00e9 des sp\u00e9cifications, MyPY ou Pyright est le choix le plus s\u00fbr pour les environnements CI n\u00e9cessitant une couverture compl\u00e8te de v\u00e9rification de type. Utilisez TY pour le d\u00e9veloppement local o\u00f9 la vitesse est importante et le Pyright (ou MyPy) pour l'IC lorsque l'exactitude est importante.<\/p>\n<h3>Po\u00e9sie pour l'\u00e9dition Pypi<\/h3>\n<p>Si vous publiez des packages Scientific Python sur Pypi, Poetry a toujours des workflows de publication m\u00fbrs, des groupes de d\u00e9pendances et un pipeline de construction bien document\u00e9. <code>uv<\/code> prend en charge la publication Pypi, mais ses flux de travail sont plus r\u00e9cents et moins document\u00e9s que ceux de Poetry. Si votre \u00e9quipe valorise la documentation \u00e9tablie et les longs enregistrements de production, la po\u00e9sie peut toujours \u00eatre le meilleur choix pour la publication de votre flux de travail.<\/p>\n<h2>R\u00e9sum\u00e9 et \u00e9tapes suivantes<\/h2>\n<p>La cha\u00eene d'outils Scientific Python a m\u00fbri. La pile aliment\u00e9e par la rouille - UV, Ruff et TY - remplace les anciens outils fragment\u00e9s par quelque chose de plus rapide, plus simple et mieux int\u00e9gr\u00e9. Voici les plats \u00e0 emporter :<\/p>\n<ol>\n<li><strong>UV<\/strong> est le gestionnaire de packages par d\u00e9faut pour les nouveaux projets. Utilisez <code>--compile-bytecode<\/code> sur les serveurs et les pipelines CI. Utilisez Conda \u00e0 ses c\u00f4t\u00e9s pour les d\u00e9pendances non Python.<\/li>\n<li><strong>Ruff<\/strong> remplace Black, Isort, Flake8, PyUpgrade et Autoflake. Scipy et Pandas l'utilisent d\u00e9j\u00e0. Configurez tout \u00e0 partir de <code>pyproject.toml<\/code>.<\/li>\n<li><strong>ty<\/strong> est le v\u00e9rificateur de type le plus rapide disponible, 20&nbsp;\u00d7 plus rapide que MyPy. Utilisez-le localement. Utilisez Pyright pour CI jusqu'\u00e0 ce que TY atteigne 1,0.<\/li>\n<li><strong>PyProject.toml<\/strong> est la seule source de configuration. Les trois outils lisent. Plus de fichiers de configuration dispers\u00e9s.<\/li>\n<\/ol>\n<p>Si vous lancez un nouveau projet de simulation, adoptez la pile moderne d\u00e8s le premier jour. Si vous migrez un projet existant, suivez le chemin \u00e9tape par \u00e9tape ci-dessus - la sortie de mise en forme de Ruff est presque identique \u00e0 celle de Black, et la garantie progressive de Ty signifie que vous ne cassez pas le code existant pendant la transition.<\/p>\n<p>Pour un contexte plus large sur la pile scientifique de la biblioth\u00e8que Python qui se trouve au-dessus de cet outillage, consultez le <a href=\"https:\/\/matforge.org\/scientific-python-ecosystem-navigating-scipy-numpy-sympy-2\/\" target=\"_blank\" rel=\"nofollow noopener\">Guide d'\u00e9cosyst\u00e8me Python scientifique<\/a>, qui couvre NumPy, Scipy, Sympy, MatPlotlib, Jupyter et Apprendre le scikit. Pour une couverture plus approfondie de la gestion des d\u00e9pendances et des fichiers de verrouillage, consultez le guide <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestion des d\u00e9pendances dans Scientific Python<\/a>. Et pour les meilleures pratiques de maintenance qui se marient bien avec la cha\u00eene d'outils moderne, lisez le guide des <a href=\"https:\/\/matforge.org\/best-practices-for-maintaining-scientific-code\/\" target=\"_blank\" rel=\"nofollow noopener\">meilleures pratiques pour maintenir le code scientifique<\/a>.<\/p>\n<p>L'\u00e9cosyst\u00e8me scientifique de Python ne va nulle part. Mais la fa\u00e7on dont vous travaillez avec cela a chang\u00e9, et l'adoption de la pile moderne vous offre des constructions plus rapides, une configuration plus simple et une meilleure reproductibilit\u00e9, le tout sans modifier les biblioth\u00e8ques que vous utilisez pour le calcul.<\/p>\n<p><!-- R\u00e9f\u00e9rences et lectures suppl\u00e9mentaires --><\/p>\n<h2>R\u00e9f\u00e9rences et lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/astral.sh\/ruff\/\" target=\"_blank\" rel=\"nofollow noopener\">Ruff Documentation<\/a> \u2014 Guide officiel pour le linter et le formateur bas\u00e9s sur la rouille.<\/li>\n<li><a href=\"https:\/\/github.com\/astral-sh\/uv\" target=\"_blank\" rel=\"nofollow noopener\">r\u00e9f\u00e9rentiel uv github<\/a> \u2014 code source officiel et documentation des fonctionnalit\u00e9s.<\/li>\n<li><a href=\"https:\/\/medium.com\/fhinkel\/python-packaging-in-2025-introducing-uv-a-speedy-new-contender-cbf408726687\" target=\"_blank\" rel=\"nofollow noopener\">Packaging Python en 2025&nbsp;: pr\u00e9sentation des UV<\/a> \u2014 Franziska Hinkelmann aper\u00e7u technique de la conception et de la philosophie des UV.<\/li>\n<li><a href=\"https:\/\/plotly.com\/blog\/uv-python-package-manager-quirks\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestionnaire de packages UV Python&nbsp;: bizarreries et le\u00e7ons Apprentissage<\/a> \u2014 L'exp\u00e9rience d'adoption dans le monde r\u00e9el de Plotly avec les UV.<\/li>\n<li><a href=\"https:\/\/www.kdnuggets.com\/python-project-setup-2026-uv-ruff-ty-polars\" target=\"_blank\" rel=\"nofollow noopener\">configuration du projet Python 2026&nbsp;: UV, Ruff, TY, Polars<\/a> - Guide de configuration \u00e9tape par \u00e9tape pour la pile moderne.<\/li>\n<li><a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">Manuel de ty<\/a> \u2014 Manuel officiel couvrant les capacit\u00e9s de TY, la garantie progressive et Int\u00e9gration du code VS.<\/li>\n<li><a href=\"https:\/\/www.resumelens.org\/blog\/python\/python-type-checkers-compared\" target=\"_blank\" rel=\"nofollow noopener\">Desseurs de type Python compar\u00e9s<\/a> - Comparaison compl\u00e8te de MyPY, Pyright, TY et Pyre avec les donn\u00e9es de conformit\u00e9 des sp\u00e9cifications.<\/li>\n<li><a href=\"https:\/\/blog.stackademic.com\/i-switched-from-mypy-to-ty-and-my-ci-type-checks-went-from-46-seconds-to-2-9a8cb1b11170\" target=\"_blank\" rel=\"nofollow noopener\">Je suis pass\u00e9 de MyPy \u00e0 TY (46s \u2192 2.19s)<\/a> \u2014 benchmark de v\u00e9rification de type dans le monde r\u00e9el sur une base de code Python scientifique.<\/li>\n<li><a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">Guide de d\u00e9veloppement scientifique Python<\/a> \u2014 Recommandations officielles de la communaut\u00e9 pour Ruff et TY.<\/li>\n<\/ul>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 14<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Apprenez la cha\u00eene d&rsquo;outils Python scientifique moderne &#8211; UV pour la gestion des colis, Ruff for Linting et TY pour la v\u00e9rification des types. Mise \u00e0 jour pour 2026 avec des rep\u00e8res et des guides de migration.<\/p>\n","protected":false,"raw":"Apprenez la cha\u00eene d'outils Python scientifique moderne - UV pour la gestion des colis, Ruff for Linting et TY pour la v\u00e9rification des types. Mise \u00e0 jour pour 2026 avec des rep\u00e8res et des guides de migration."},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=1051","iawp_total_views":1,"footnotes":""},"categories":[1],"tags":[72,73,71,68,16,70,69],"class_list":["post-1213","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","tag-astral","tag-python-package-manager","tag-python-tooling","tag-ruff","tag-scientific-python","tag-type-checking","tag-uv","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Outil Python scientifique moderne en 2026 : UV, Ruff et Ty - matforge.org<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  14 minutesApprenez la cha\u00eene d&#039;outils Python scientifique moderne - UV pour la gestion des colis, Ruff for Linting et TY pour la v\u00e9rification des types. Mise \u00e0 jour pour 2026 avec des rep\u00e8res et des guides de migration.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:28:48+00:00\" \/>\n<meta name=\"author\" content=\"steven\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"steven\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\"},\"author\":{\"name\":\"steven\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"headline\":\"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty\",\"datePublished\":\"2026-08-21T14:28:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\"},\"wordCount\":4022,\"commentCount\":0,\"keywords\":[\"Astral\",\"Python package manager\",\"Python tooling\",\"Ruff\",\"scientific python\",\"type checking\",\"uv\"],\"articleSection\":[\"Simulation &amp; Projets de mod\u00e9lisation\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\",\"name\":\"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:28:48+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\",\"name\":\"steven\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"caption\":\"steven\"},\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/steven\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty - matforge.org","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/","og_locale":"fr_FR","og_type":"article","og_title":"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty - matforge.org","og_description":"Reading Time:  14 minutesApprenez la cha\u00eene d'outils Python scientifique moderne - UV pour la gestion des colis, Ruff for Linting et TY pour la v\u00e9rification des types. Mise \u00e0 jour pour 2026 avec des rep\u00e8res et des guides de migration.","og_url":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:28:48+00:00","author":"steven","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"steven","Dur\u00e9e de lecture estim\u00e9e":"21 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/"},"author":{"name":"steven","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"headline":"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty","datePublished":"2026-08-21T14:28:48+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/"},"wordCount":4022,"commentCount":0,"keywords":["Astral","Python package manager","Python tooling","Ruff","scientific python","type checking","uv"],"articleSection":["Simulation &amp; Projets de mod\u00e9lisation"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/","url":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/","name":"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:28:48+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/modern-scientific-python-tooling-uv-ruff-type-checking\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Outil Python scientifique moderne en 2026 : UV, Ruff et Ty"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03","name":"steven","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","caption":"steven"},"url":"https:\/\/matforge.org\/author\/steven\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1213"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1213\/revisions"}],"predecessor-version":[{"id":1377,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1213\/revisions\/1377"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}