{"id":1106,"date":"2026-08-19T09:48:36","date_gmt":"2026-08-19T09:48:36","guid":{"rendered":"https:\/\/matforge.org\/?p=1106","raw":"https:\/\/matforge.org\/?p=1106"},"modified":"2026-08-19T09:48:36","modified_gmt":"2026-08-19T09:48:36","slug":"modern-scientific-python-tooling-uv-ruff-type-checking","status":"publish","type":"post","link":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/","title":{"rendered":"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y Ty","raw":"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y 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>Comida clave<\/h2>\n<ul>\n<li><strong>UV<\/strong> se ha convertido en el administrador de paquetes de Python predeterminado para la inform\u00e1tica cient\u00edfica, de 10 a 100 veces m\u00e1s r\u00e1pido que PIP, con archivos de bloqueo deterministas que hacen que los flujos de trabajo de investigaci\u00f3n sean reproducibles.<\/li>\n<li><strong>Ruff<\/strong> Reemplaza a Black, iSort, Flake8, PyUpgrade y Autoflake en un solo binario basado en \u00f3xido. Scipy, pandas y otras bibliotecas cient\u00edficas importantes lo usan hoy en d\u00eda.<\/li>\n<li><strong>ty<\/strong> (publicado en diciembre de 2025) es de 20 a 100 veces m\u00e1s r\u00e1pido que myPy y utiliza una garant\u00eda gradual que no romper\u00e1 el c\u00f3digo no anotado, ideal para migrar c\u00f3digos de investigaci\u00f3n.<\/li>\n<li><strong>PyProject.Toml<\/strong> es ahora la \u00fanica fuente de configuraci\u00f3n para toda la cadena de herramientas, reemplazando archivos de configuraci\u00f3n dispersos como <code>.flake8<\/code>, <code>.isort.cfg<\/code> y <code>mypy.ini<\/code>.<\/li>\n<li><strong>Para la computaci\u00f3n cient\u00edfica espec\u00edficamente<\/strong>, la conda sigue siendo necesaria para las dependencias que no son de Python (MPI, CUDA, HDF5) y Pyright sigue siendo la opci\u00f3n de CI m\u00e1s segura hasta que TY alcance la versi\u00f3n 1.0.<\/li>\n<\/ul>\n<p>Si est\u00e1 ejecutando flujos de trabajo cient\u00edficos de Python en 2026, su cadena de herramientas ha cambiado fundamentalmente. Los paquetes que utiliza para el c\u00e1lculo (numpy, scipy, fipy y el resto) son los mismos. Pero la forma en que los instala, administra, pelusa y marca los tipos es diferente de lo que la mayor\u00eda de los tutoriales, las gu\u00edas anteriores y los cuadernos de laboratorio universitarios a\u00fan recomiendan.<\/p>\n<p>Astral, la compa\u00f1\u00eda detr\u00e1s del linter (ruff) m\u00e1s popular de Python, construy\u00f3 tres herramientas que ahora cubren todo el flujo de trabajo del desarrollador: <strong>UV<\/strong> para la gesti\u00f3n de paquetes, <strong>ruff<\/strong> para el envio y el formato, y <strong>ty<\/strong> para la verificaci\u00f3n de tipos. Juntos, reemplazan a pip, venv, black, isort, flake8 y mypy. Son seis herramientas colapsadas en tres, todas configuradas a partir de un solo archivo <code>pyproject.toml<\/code>.<\/p>\n<p>Este art\u00edculo cubre la cadena cient\u00edfica moderna de herramientas Python en 2026. Explica qu\u00e9 hace cada herramienta, por qu\u00e9 ocurri\u00f3 el cambio y c\u00f3mo configurar todo, incluidas las peculiaridades y las limitaciones que importan para la computaci\u00f3n cient\u00edfica. Si est\u00e1 configurando un nuevo proyecto de simulaci\u00f3n, migrando una base de c\u00f3digo existente o poni\u00e9ndonos al d\u00eda despu\u00e9s de la gu\u00eda \u00abEcosistema de Python cient\u00edfico\u00bb (consulte el art\u00edculo <a href=\"https:\/\/matforge.org\/scientific-python-ecosystem-navigating-scipy-numpy-sympy-2\/\">#364<\/a>), esta es la actualizaci\u00f3n pr\u00e1ctica que necesita.<\/p>\n<h2>El moderno paisaje de herramientas<\/h2>\n<p>Hasta aproximadamente 2024, el flujo de trabajo de Scientific Python Developer se ve\u00eda as\u00ed:<\/p>\n<ul>\n<li><strong>Gesti\u00f3n de paquetes<\/strong>: pip con pip-tools o poes\u00eda<\/li>\n<li><strong>Entornos virtuales<\/strong>: Venv o VirtualEnV<\/li>\n<li><strong>Administraci\u00f3n de versiones de Python<\/strong>: PYENV o PYENV-VirtualEnv<\/li>\n<li><strong>linting<\/strong>: Flake8, luego PydocStyle, m\u00e1s Pylint para verificaciones de estilo<\/li>\n<li><strong>Formatear<\/strong>: negro e iSort (y posteriormente, AutoPep8 y PyUpgrade)<\/li>\n<li><strong>Comprobaci\u00f3n de tipo<\/strong>: myPy<\/li>\n<\/ul>\n<p>Eso signific\u00f3 instalar seis paquetes de Python separados, mantener archivos de configuraci\u00f3n separados y esperar a trav\u00e9s de pasos de resoluci\u00f3n secuenciales. Un simple <code>pip install<\/code> podr\u00eda tomar minutos. Ejecuci\u00f3n negra, luego isort, luego flake8, luego mypy podr\u00eda tomar m\u00e1s tiempo.<\/p>\n<p>El cambio comenz\u00f3 cuando Astral lanz\u00f3 Ruff en 2023. Ruff se escribi\u00f3 en \u00f3xido, dise\u00f1ado para reemplazar negro, iSort, Flake8, PyUpgrade y Autoflake simult\u00e1neamente, y corri\u00f3 \u00f3rdenes de magnitud m\u00e1s r\u00e1pido que las alternativas basadas en Python. Ese \u00e9xito en la adopci\u00f3n le dio a Astral el impulso para construir un ecosistema completo: UV para la gesti\u00f3n de paquetes y TY para la verificaci\u00f3n de tipos.<\/p>\n<p>A fines de 2025 y principios de 2026, la convergencia estaba completa. El <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">gu\u00eda cient\u00edfica de desarrollo de Python<\/a> ahora recomienda oficialmente Ruff para verificaciones de estilo y ty para verificaci\u00f3n de tipo. Scipy y Pandas han adoptado Ruff. UV ha superado la poes\u00eda en adopci\u00f3n entre los equipos de computaci\u00f3n cient\u00edfica. La pila anterior no est\u00e1 muerta, todav\u00eda funciona, pero ya no es la predeterminada para nuevos proyectos.<\/p>\n<h3>Por qu\u00e9 es importante PyProject.toml<\/h3>\n<p>Uno de los mayores cambios pr\u00e1cticos es el modelo de configuraci\u00f3n. La antigua configuraci\u00f3n de pila dispersa en cinco o m\u00e1s archivos:<\/p>\n<ul>\n<li><code>.flake8<\/code> Para las reglas de pelusa<\/li>\n<li><code>.isort.cfg<\/code> para la clasificaci\u00f3n de importaci\u00f3n<\/li>\n<li><code>mypy.ini<\/code> para el comportamiento de verificaci\u00f3n de tipo<\/li>\n<li><code>setup.cfg<\/code> para los metadatos del paquete<\/li>\n<li><code>pyproject.toml<\/code> (parcialmente, para sistemas de construcci\u00f3n)<\/li>\n<\/ul>\n<p>Las herramientas modernas centralizan todo en <code>pyproject.toml<\/code>. Un solo archivo define el paquete, las dependencias, las herramientas de desarrollo y la configuraci\u00f3n de la herramienta. Esto hace que los proyectos sean m\u00e1s f\u00e1ciles de compartir, clonar y mantener, exactamente lo que necesitan los equipos de investigaci\u00f3n cuando publican c\u00f3digo o incorporan a nuevos estudiantes.<\/p>\n<h2>UV: gesti\u00f3n de paquetes que realmente funciona<\/h2>\n<p><code>uv<\/code> es un administrador de paquetes basado en \u00f3xido construido por Astral. Reemplaza PIP, PIP-Tools, PiPX, PYENV y VirtualEnv en un solo binario r\u00e1pido. A diferencia de PIP, <code>uv<\/code> no requiere que Python se instale primero: puede iniciar un int\u00e9rprete de Python y administrar versiones junto con las dependencias.<\/p>\n<h3>Por qu\u00e9 los investigadores est\u00e1n cambiando<\/h3>\n<p>Las principales razones por las que los investigadores y desarrolladores eligen <code>uv<\/code>:<\/p>\n<ol>\n<li><strong>Velocidad<\/strong>. <code>uv<\/code> instala paquetes de 10 a 100 veces m\u00e1s r\u00e1pido que PIP, principalmente a trav\u00e9s de resoluci\u00f3n paralela y almacenamiento en cach\u00e9 agresivo. Esto importa en las canalizaciones de CI donde el tiempo de instalaci\u00f3n afecta directamente a la respuesta del desarrollador.<\/li>\n<li><strong>Archivos de bloqueo<\/strong>. Un solo archivo <code>uv.lock<\/code> registra versiones resueltas exactas de cada dependencia, incluidas las subdependencias. Comprometer este archivo a Git hace que su entorno sea completamente reproducible, un requisito para las simulaciones publicadas.<\/li>\n<li><strong>Gesti\u00f3n de versiones de Python<\/strong>. <code>uv<\/code> Puede descargar y administrar int\u00e9rpretes de Python, eliminando la necesidad de herramientas separadas como PYENV.<\/li>\n<li><strong>Compatibilidad PIP<\/strong>. Los comandos como <code>uv pip install<\/code> funcionan con <code>requirements.txt<\/code>, lo que simplifica la migraci\u00f3n de los proyectos existentes.<\/li>\n<\/ol>\n<h3>Configuraci\u00f3n de UV<\/h3>\n<p>El flujo de trabajo t\u00edpico para un nuevo proyecto cient\u00edfico de Python se ve as\u00ed:<\/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> Se instala desde el archivo de bloqueo, asegurando reproducciones deterministas. Cualquiera que clone el repositorio y ejecute <code>uv sync<\/code> obtiene exactamente las mismas versiones resueltas.<\/p>\n<h3>La peculiaridad de compilaci\u00f3n de c\u00f3digo de bytes<\/h3>\n<p>Aqu\u00ed es donde <code>uv<\/code> se comporta de manera diferente a PIP, y donde los equipos de computaci\u00f3n cient\u00edfica han golpeado muros inesperados.<\/p>\n<p><code>uv<\/code> Difiere la compilaci\u00f3n de c\u00f3digo de bytes a la primera ejecuci\u00f3n. Cuando <code>uv<\/code> instala un paquete, almacena c\u00f3digo de bytes precompilado en una cach\u00e9 pero no compila todos los archivos de inmediato. Esto hace que las instalaciones <code>uv<\/code> sean aproximadamente de 3 a 4 veces m\u00e1s r\u00e1pidas que PIP. Sin embargo, la primera importaci\u00f3n de una biblioteca (especialmente numpy o scipy) puede ser aproximadamente 2,5 veces m\u00e1s lenta que una copia instalada en PIP, porque el c\u00f3digo de byte se compila en el momento de la importaci\u00f3n.<\/p>\n<p>Para el desarrollo interactivo, esta desaceleraci\u00f3n suele ser imperceptible. Para las canalizaciones de CI, los scripts de trabajo de HPC o los servidores de producci\u00f3n que importan Numpy o Scipy en cada ejecuci\u00f3n, la peculiaridad importa. La soluci\u00f3n es simple: agregue <code>--compile-bytecode<\/code> a su comando de sincronizaci\u00f3n.<\/p>\n<p><em>Contexto del mundo real: el equipo de datos de Plotly document\u00f3 este problema exacto despu\u00e9s de adoptar <code>uv<\/code> en producci\u00f3n. Sus servidores de producci\u00f3n vieron importaciones numpy notablemente m\u00e1s lentas hasta que agregaron la bandera. Vea la publicaci\u00f3n de <a href=\"https:\/\/plotly.com\/blog\/uv-python-package-manager-quirks\/\" target=\"_blank\" rel=\"nofollow noopener\">Party de Plotly sobre las peculiaridades UV<\/a> para conocer el desglose t\u00e9cnico completo.<\/em><\/p>\n<h3>El comportamiento de \u00edndice exclusivo<\/h3>\n<p><code>uv<\/code> Trata <code>--extra-index-url<\/code> entradas exclusivas de forma predeterminada, despu\u00e9s de PEP 0708. Esto significa que si existe un paquete en su \u00edndice principal, <code>uv<\/code> nunca comprobar\u00e1 el \u00edndice adicional. Esto protege contra los ataques de dependencia: un actor malintencionado no puede reemplazar un paquete alojado en un \u00edndice bien conocido con un espejo comprometido. Pero tambi\u00e9n rompe las tuber\u00edas existentes <code>requirements.txt<\/code> que dependen de \u00edndices adicionales para los paquetes alternativos.<\/p>\n<p>Si su laboratorio usa un \u00edndice de paquete privado o un \u00edndice compatible con CONDA, deber\u00e1 configurar expl\u00edcitamente el <code>index-strategy<\/code> en <code>pyproject.toml<\/code>. Sin esa configuraci\u00f3n, <code>uv<\/code> puede no resolver los paquetes que espera encontrar en el \u00edndice adicional.<\/p>\n<h3>Cuando los rayos UV no son suficientes<\/h3>\n<p><code>uv<\/code> Administra paquetes de Python e int\u00e9rpretes de Python. No administra las dependencias del sistema que no son de Python: bibliotecas C y C++, compiladores Fortran, kits de herramientas MPI, CUDA, HDF5, FFTW o bibliotecas de gr\u00e1ficos.<\/p>\n<p>Para esas dependencias, Conda sigue siendo el est\u00e1ndar. El patr\u00f3n recomendado es usar <code>uv<\/code> para paquetes de Python y conda (o PIXI) para dependencias a nivel de sistema. Muchos equipos cient\u00edficos emparejan las dos herramientas: conda para la pila del sistema, <code>uv<\/code> para la capa de Python.<\/p>\n<p>Si su proyecto involucra dependencias que no son de Python como MPI, CUDA o HDF5, consulte la gu\u00eda relacionada sobre <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Administraci\u00f3n de dependencias en Python cient\u00edfico<\/a>, que cubre la conda, los archivos de bloqueo y cu\u00e1ndo usar cada herramienta.<\/p>\n<h2>Ruff: el linter que reemplaza a seis herramientas<\/h2>\n<p>Ruff es un linter y formateador basados en \u00f3xido construido por Astral. Reemplaza a Black (Formateando), iSort (Import ordenar), Flake8 (comprobaciones de estilo), PyUpgrade (eliminaci\u00f3n de c\u00f3digo muerto) y Autoflake (eliminaci\u00f3n de variables no utilizadas) en un solo binario que se ejecuta de 10 a 100 veces m\u00e1s r\u00e1pido que la pila anterior combinada.<\/p>\n<p>Eso lo hace especialmente atractivo para la inform\u00e1tica cient\u00edfica, donde las grandes bases de c\u00f3digo con versiones mixtas de Python y m\u00f3dulos heredados pueden tardar varios segundos en verse con las herramientas tradicionales. Ruff lo hace en milisegundos.<\/p>\n<h3>Las bibliotecas cient\u00edficas ya usan Ruff<\/h3>\n<p>Ruff ya no es solo un linter de marco web. Las principales bibliotecas cient\u00edficas lo han adoptado:<\/p>\n<ul>\n<li><strong>scipy<\/strong> \u2014 El equipo central de la biblioteca de m\u00e9todos num\u00e9ricos migr\u00f3 a Ruff.<\/li>\n<li><strong>Pandas<\/strong>: utiliza Ruff para la aplicaci\u00f3n del estilo en toda la base de c\u00f3digo.<\/li>\n<li><strong>Fastapi<\/strong> y <strong>cara de abrazo<\/strong>: ambos usan Ruff como su \u00fanico formateador y linter.<\/li>\n<\/ul>\n<p>Esta adopci\u00f3n es importante porque se\u00f1ala que Ruff maneja los casos extremos de c\u00f3digo cient\u00edfico (cadenas de documentaci\u00f3n largas, anotaciones de tipo complejo, importaciones heredadas de estilo Python-2) sin perder la correcci\u00f3n ni introducir errores de formato. La documentaci\u00f3n oficial de Ruff enumera las tres bibliotecas como adoptantes. Consulte los <a href=\"https:\/\/astral.sh\/ruff\/\" target=\"_blank\" rel=\"nofollow noopener\">documentos oficiales de Ruff<\/a> para obtener la lista completa.<\/p>\n<h3>Configuraci\u00f3n<\/h3>\n<p>Ruff se configura completamente desde <code>pyproject.toml<\/code>:<\/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>La matriz <code>select<\/code> especifica qu\u00e9 conjuntos de reglas habilitar. <code>E<\/code> y <code>F<\/code> cubren los errores de PEP 8 y las comprobaciones de los copos de Py. <code>I<\/code> Maneja la clasificaci\u00f3n de importaciones (reemplazando isort). <code>N<\/code> Hace cumplir las convenciones de nomenclatura. <code>UP<\/code> Ejecuta la modernizaci\u00f3n del estilo PyUpgrade. <code>RUF<\/code> Agrega reglas espec\u00edficas de Ruff. La l\u00ednea <code>ignore<\/code> elimina E501 (l\u00ednea demasiado larga) porque Ruff delega la longitud de la l\u00ednea al formateador, manteniendo el linter r\u00e1pido.<\/p>\n<h3>Migraci\u00f3n desde negro + iSort + Flake8<\/h3>\n<p>Eliminar la pila antigua es sencillo. Despu\u00e9s de instalar Ruff, puede reemplazar los comandos:<\/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> Maneja todas las comprobaciones de estilo. <code>ruff format<\/code> Maneja todo el formato. Son dos comandos en lugar de cuatro, ejecutando un binario en lugar de cuatro separados.<\/p>\n<p>La Gu\u00eda de Desarrollo Cient\u00edfico de Python recomienda expl\u00edcitamente migrar de Flake8 a Ruff para verificaciones de estilo. Consulte <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">su gu\u00eda de seguridad y desarrollo<\/a> para conocer la recomendaci\u00f3n oficial.<\/p>\n<h2>TY: Comprobaci\u00f3n de tipo sin dolor<\/h2>\n<p><code>ty<\/code> es el verificador de tipo de pr\u00f3xima generaci\u00f3n de Astral, lanzado en diciembre de 2025. Reemplaza a myPy como el verificador de tipo est\u00e1tico recomendado en el ecosistema astral. Est\u00e1 escrito en \u00f3xido y dise\u00f1ado para ser r\u00e1pido, estricto por defecto y compatible con c\u00f3digo no anotado.<\/p>\n<h3>La victoria de la velocidad<\/h3>\n<p>La ventaja m\u00e1s dram\u00e1tica de Ty es la velocidad. En un punto de referencia del mundo real de un usuario que migr\u00f3 de mypy a ty en una base de c\u00f3digo de Python cient\u00edfico real, mypy tom\u00f3 <strong>46 segundos<\/strong> y Ty complet\u00f3 el mismo cheque en <strong>2.19 segundos<\/strong>, aproximadamente 20 veces m\u00e1s r\u00e1pido. Consulte el punto de referencia completo en <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\">La publicaci\u00f3n de migraci\u00f3n de StackAdemic<\/a>.<\/p>\n<p>Esto importa porque la verificaci\u00f3n de tipos suele ser el paso de CI m\u00e1s largo en un flujo de trabajo de Python. Reducir 46 segundos a 2,2 segundos reduce los tiempos de cola de CI, permite a los desarrolladores obtener comentarios m\u00e1s r\u00e1pidos y hace que la verificaci\u00f3n de tipo completa sea factible en las ramas, donde incluso se habr\u00edan omitido los verificadores de tipo lento.<\/p>\n<h3>La garant\u00eda gradual<\/h3>\n<p>A diferencia de mypy, Ty implementa una <strong>garant\u00eda gradual<\/strong>: no aparecer\u00e1 errores en el c\u00f3digo que no tiene anotaciones. Si un m\u00f3dulo contiene <code>def calculate(x, y): return x + y<\/code> sin sugerencias de tipo, Ty lo trata como no escrito y no se queja de que faltan anotaciones. Esto es ideal para migrar bases de c\u00f3digos cient\u00edficos que tienen m\u00f3dulos parcialmente tipificados, un patr\u00f3n com\u00fan en el c\u00f3digo de investigaci\u00f3n donde se escribe el motor de simulaci\u00f3n central, pero los scripts y cuadernos auxiliares no lo son.<\/p>\n<p><a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">el manual oficial de TY<\/a> explica la garant\u00eda gradual en detalle. El punto clave es que agregar anotaciones de tipo a un m\u00f3dulo no hace que TY informe errores en ese m\u00f3dulo; solo informa errores en el c\u00f3digo ya escrito. MyPy hace lo contrario: informa errores en cualquier funci\u00f3n no anotada que encuentra, lo que rompe las bases de c\u00f3digo existentes que carecen de anotaciones completas.<\/p>\n<h3>Conformidad de especificaciones: la compensaci\u00f3n<\/h3>\n<p>Aqu\u00ed est\u00e1 la compensaci\u00f3n que debe comprender antes de poner ty en CI.<\/p>\n<p>De acuerdo con <a href=\"https:\/\/www.resumelens.org\/blog\/python\/python-type-checkers-compared\" target=\"_blank\" rel=\"nofollow noopener\">una comparaci\u00f3n completa de mypy, Pyright, Ty y Pyre<\/a>, la conformidad de especificaciones de tipo Python de Ty se encuentra en aproximadamente <strong>53 por ciento<\/strong>, mientras que Pyright logra aproximadamente <strong>98 por ciento<\/strong> y mypy alcanza aproximadamente <strong>58 por ciento<\/strong>. Esto significa que TY cubre solo la mitad de las caracter\u00edsticas de las especificaciones de escritura, y puede pasar por alto los casos de Pyright que detecta.<\/p>\n<p>Hasta que TY llegue a la versi\u00f3n 1.0, la estrategia de CI recomendada es un enfoque de dos capas:<\/p>\n<ol>\n<li><strong>Desarrollo local<\/strong>: use ty para comentarios r\u00e1pidos (verificaciones de 2 segundos).<\/li>\n<li><strong>Tipelines de CI<\/strong>: use Pyright para una cobertura de especificaciones completa (capta los errores).<\/li>\n<\/ol>\n<p>Esto le da velocidad y correcci\u00f3n. Una vez que Ty llega a 1.0 y su conformidad de especificaciones mejora, puede confiar solo en Ty para CI.<\/p>\n<h3>Configuraci\u00f3n<\/h3>\n<p>ty configura desde <code>pyproject.toml<\/code>:<\/p>\n<pre><code class=\"language-toml\">[tool.typer]\npython-version = \"3.11\"\nstrict = true\n<\/code><\/pre>\n<p>El indicador <code>strict<\/code> habilita todas las comprobaciones de modo estricto (columna impl\u00edcita, no-def sin tipo, etc.). Consulte <a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">El manual de TY<\/a> para obtener la referencia de configuraci\u00f3n completa.<\/p>\n<h2>Gu\u00eda de migraci\u00f3n: de pila antigua a nueva<\/h2>\n<p>Aqu\u00ed est\u00e1 la comparaci\u00f3n pr\u00e1ctica de antes y despu\u00e9s. Si actualmente est\u00e1 utilizando pip, venv, negro, isort, flake8 y mypy, esta tabla muestra exactamente qu\u00e9 reemplaza a cada herramienta.<\/p>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Tarea<\/th>\n<th>Pila antigua (2023 y anteriores)<\/th>\n<th>Pila moderna (2025-2026)<\/th>\n<th>notas<\/th>\n<\/tr>\n<tr>\n<td>Administrador de paquetes<\/td>\n<td>pepita<\/td>\n<td>UV<\/td>\n<td>10-100 \u00d7 instalaciones m\u00e1s r\u00e1pidas, archivos de bloqueo incluidos<\/td>\n<\/tr>\n<tr>\n<td>Entornos virtuales<\/td>\n<td>Venv \/ VirtualEnv<\/td>\n<td>Construido en UV<\/td>\n<td>UV gestiona venvs autom\u00e1ticamente<\/td>\n<\/tr>\n<tr>\n<td>Gesti\u00f3n de versiones de Python<\/td>\n<td>Pyenv \/ Pyenv-VirtualEnv<\/td>\n<td>Construido en UV<\/td>\n<td>UV descargas int\u00e9rpretes bajo demanda<\/td>\n<\/tr>\n<tr>\n<td>peluquer\u00eda de estilo<\/td>\n<td>Flake8, PydocStyle<\/td>\n<td>Fallar<\/td>\n<td>Ruff reemplaza ambos en un binario<\/td>\n<\/tr>\n<tr>\n<td>formateo<\/td>\n<td>Negro<\/td>\n<td>Ruff (formato de Ruff)<\/td>\n<td>La misma salida que el negro en la mayor\u00eda de los casos<\/td>\n<\/tr>\n<tr>\n<td>Clasificaci\u00f3n de importaci\u00f3n<\/td>\n<td>iSort<\/td>\n<td>Ruff (verificaci\u00f3n de Ruff &#8211;fix)<\/td>\n<td>Construido en las reglas de pelusa de Ruff<\/td>\n<\/tr>\n<tr>\n<td>Comprobaci\u00f3n de tipo<\/td>\n<td>mipy<\/td>\n<td>Ty (local), Pyright (IC)<\/td>\n<td>Ty es 20 \u00d7 m\u00e1s r\u00e1pido; Pyright atrapa a Ty fallas<\/td>\n<\/tr>\n<tr>\n<td>Configuraci\u00f3n<\/td>\n<td>5+ archivos de configuraci\u00f3n dispersos<\/td>\n<td>solo pyproject.toml<\/td>\n<td>Todas las herramientas le\u00eddas de un archivo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Migraci\u00f3n paso a paso<\/h3>\n<p>Aqu\u00ed est\u00e1 la ruta de migraci\u00f3n concreta para un proyecto existente:<\/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>Esta ruta funciona porque la salida de Ruff es casi id\u00e9ntica al estilo de formato de Black, por lo que el c\u00f3digo formateado parece familiar. La garant\u00eda gradual de TY significa que no romper\u00e1 los m\u00f3dulos no anotados durante la migraci\u00f3n. Puede agregar anotaciones de tipo de forma incremental sin temor a que Ty supere los errores en el c\u00f3digo que a\u00fan no ha escrito.<\/p>\n<p>Si su proyecto se basa en <code>requirements.txt<\/code>, tenga en cuenta que <code>uv<\/code> puede instalar desde <code>uv pip install -r requirements.txt<\/code>. Pero para la reproducibilidad a largo plazo, genere un archivo <code>uv.lock<\/code> y aleje de <code>requirements.txt<\/code>. Consulte la gu\u00eda relacionada sobre <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gesti\u00f3n de dependencias en Scientific Python<\/a> para obtener m\u00e1s informaci\u00f3n sobre archivos de bloqueo y reproducibilidad.<\/p>\n<h2>Lo que recomendamos: Un marco de decisi\u00f3n<\/h2>\n<p>No todos los equipos deben adoptar las tres herramientas simult\u00e1neamente. La pila correcta depende de los requisitos de su proyecto. Utilice este marco de decisi\u00f3n para elegir:<\/p>\n<ol>\n<li><strong>\u00bfNecesita dependencias que no sean de Python?<\/strong> (MPI, CUDA, HDF5, C++ Bibliotecas, compiladores Fortran)\n<ul>\n<li><strong>S\u00ed<\/strong>: use conda para esas dependencias. Todav\u00eda puede usar <code>uv<\/code> para los paquetes de Python junto con Conda.<\/li>\n<li><strong>No<\/strong>: Contin\u00fae con la siguiente pregunta.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u00bfEst\u00e1s publicando un paquete de Python en PYPI?<\/strong>\n<ul>\n<li><strong>s\u00ed<\/strong>: Considere poes\u00eda para maduro Publicaci\u00f3n de flujos de trabajo, o <code>uv<\/code> para instalaciones m\u00e1s r\u00e1pidas durante el desarrollo. Ambos soportan la publicaci\u00f3n PYPI.<\/li>\n<li><strong>no<\/strong>: <code>uv<\/code> es la opci\u00f3n predeterminada Proyectos.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u00bfEst\u00e1s trabajando en canalizaciones CI\/CD donde importa el tiempo de instalaci\u00f3n?<\/strong>\n<ul>\n<li><strong>S\u00ed<\/strong> <code>uv<\/code>. Las ganancias de velocidad (10-100\u00d7 sobre PIP) reducen directamente los tiempos de cola de CI.<\/li>\n<li><strong>No<\/strong>: <code>uv<\/code> o la poes\u00eda puede funcionar dependiendo de la familiaridad del equipo.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u00bfQu\u00e9 tan importante es la cobertura de especificaciones de verificaci\u00f3n de tipo completa en CI?<\/strong>\n<ul>\n<li><strong>High<\/strong>: use pyright para CI, ty para el desarrollo local. Esto te da velocidad y correcci\u00f3n.<\/li>\n<li><strong>bajo<\/strong>: Ty solo es suficiente para la mayor\u00eda de las bases de c\u00f3digo de investigaci\u00f3n.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Para la mayor\u00eda de los nuevos proyectos de investigaci\u00f3n, la pila recomendada es:<\/p>\n<ul>\n<li><strong>UV<\/strong> para la gesti\u00f3n de paquetes y los archivos de bloqueo<\/li>\n<li><strong>ruff<\/strong> para pelusas y formatear<\/li>\n<li><strong>ty<\/strong> para la verificaci\u00f3n de tipo local (comentarios r\u00e1pidos)<\/li>\n<li><strong>Pyright<\/strong> para la verificaci\u00f3n de tipo CI (cobertura completa de especificaciones)<\/li>\n<\/ul>\n<p>Esa combinaci\u00f3n le da velocidad, correcci\u00f3n y reproducibilidad: los tres pilares de la calidad del software de investigaci\u00f3n.<\/p>\n<h2>Limitaciones: Cu\u00e1ndo quedarse con las herramientas antiguas<\/h2>\n<p>La pila moderna es poderosa, pero no es un reemplazo universal. Aqu\u00ed es cuando debes mantener las herramientas antiguas:<\/p>\n<h3>Conda para dependencias que no son de Python<\/h3>\n<p>UV administra paquetes de Python e int\u00e9rpretes de Python. No maneja bibliotecas C compiladas, compiladores Fortran, MPI, CUDA Toolkits, HDF5, FFTW o bibliotecas de gr\u00e1ficos. Para ellos, CONDA (o PIXI) sigue siendo el est\u00e1ndar de la computaci\u00f3n cient\u00edfica. Muchos equipos usan conda para las dependencias del sistema y <code>uv<\/code> para los paquetes de Python en el mismo entorno.<\/p>\n<h3>mypy para una cobertura de especificaciones completa<\/h3>\n<p>Hasta que TY alcance la versi\u00f3n 1.0 y cierre su brecha de conformidad de especificaciones, mypy o pyright es la opci\u00f3n m\u00e1s segura para entornos CI que necesitan una cobertura de verificaci\u00f3n de tipo completa. Use ty para el desarrollo local donde la velocidad importa y el pyright (o mypy) para CI donde la correcci\u00f3n importa.<\/p>\n<h3>Poes\u00eda para Pypi<\/h3>\n<p>Si publica paquetes cient\u00edficos de Python en PYPI, la poes\u00eda todav\u00eda tiene flujos de trabajo de publicaci\u00f3n maduros, grupos de dependencias y una canalizaci\u00f3n de compilaci\u00f3n bien documentada. <code>uv<\/code> Admite la publicaci\u00f3n PYPI, pero sus flujos de trabajo son m\u00e1s nuevos y menos documentados que los de la poes\u00eda. Si su equipo valora la documentaci\u00f3n establecida y los largos registros de producci\u00f3n, la poes\u00eda a\u00fan puede ser la mejor opci\u00f3n para el lado de la publicaci\u00f3n de su flujo de trabajo.<\/p>\n<h2>Resumen y pr\u00f3ximos pasos<\/h2>\n<p>La cadena de herramientas cient\u00edfica Python ha madurado. La pila de \u00f3xido (UV, Ruff y Ty) reemplaza las viejas herramientas fragmentadas con algo m\u00e1s r\u00e1pido, simple y mejor integrado. Aqu\u00ed est\u00e1n las comidas para llevar:<\/p>\n<ol>\n<li><strong>UV<\/strong> es el administrador de paquetes predeterminado para nuevos proyectos. Utilice <code>--compile-bytecode<\/code> en servidores y canalizaciones de CI. Use conda junto con ella para dependencias que no son de Python.<\/li>\n<li><strong>ruff<\/strong> reemplaza negro, isort, flake8, pyupgrade y autoflake. Scipy y Pandas ya lo usan. Configure todo desde <code>pyproject.toml<\/code>.<\/li>\n<li><strong>ty<\/strong> es el verificador de tipo m\u00e1s r\u00e1pido disponible: 20\u00d7 m\u00e1s r\u00e1pido que mypy. \u00daselo localmente. Use Pyright para CI hasta que Ty llegue a 1.0.<\/li>\n<li><strong>PyProject.Toml<\/strong> es la \u00fanica fuente de configuraci\u00f3n. Las tres herramientas le\u00eddas de \u00e9l. No m\u00e1s archivos de configuraci\u00f3n dispersos.<\/li>\n<\/ol>\n<p>Si est\u00e1 iniciando un nuevo proyecto de simulaci\u00f3n, adopte la pila moderna desde el primer d\u00eda. Si est\u00e1 migrando un proyecto existente, siga la ruta paso a paso anterior: la salida de formato de Ruff es casi id\u00e9ntica a la de Black, y la garant\u00eda gradual de Ty significa que no romper\u00e1 el c\u00f3digo existente durante la transici\u00f3n.<\/p>\n<p>Para un contexto m\u00e1s amplio en la pila de la biblioteca cient\u00edfica Python que se encuentra encima de esta herramienta, consulte la <a href=\"https:\/\/matforge.org\/scientific-python-ecosystem-navigating-scipy-numpy-sympy-2\/\" target=\"_blank\" rel=\"nofollow noopener\">Gu\u00eda del ecosistema de Python cient\u00edfico<\/a>, que cubre Numpy, Scipy, Sympy, Matplotlib, Jupyter y Scikit-aprender. Para obtener una cobertura m\u00e1s profunda de la gesti\u00f3n de dependencias y los archivos de bloqueo, consulte la gu\u00eda <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestionar dependencias en Scientific Python<\/a>. Y para las mejores pr\u00e1cticas de mantenimiento que combinan bien con la cadena de herramientas moderna, lea la gu\u00eda <a href=\"https:\/\/matforge.org\/best-practices-for-maintaining-scientific-code\/\" target=\"_blank\" rel=\"nofollow noopener\">Mejores pr\u00e1cticas para mantener el c\u00f3digo cient\u00edfico<\/a>.<\/p>\n<p>El ecosistema cient\u00edfico de Python no va a ninguna parte. Pero la forma en que trabaja con \u00e9l ha cambiado, y la adopci\u00f3n de la pila moderna le brinda compilaciones m\u00e1s r\u00e1pidas, una configuraci\u00f3n m\u00e1s simple y una mejor reproducibilidad, todo sin cambiar las bibliotecas que usa para el c\u00e1lculo.<\/p>\n<p><!-- Referencias y lecturas adicionales --><\/p>\n<h2>Referencias y lectura adicional<\/h2>\n<ul>\n<li><a href=\"https:\/\/astral.sh\/ruff\/\" target=\"_blank\" rel=\"nofollow noopener\">Documentaci\u00f3n de Ruff<\/a> \u2014 Gu\u00eda oficial del linter y formateador basados en \u00f3xido.<\/li>\n<li><a href=\"https:\/\/github.com\/astral-sh\/uv\" target=\"_blank\" rel=\"nofollow noopener\">Repositorio de UV GitHub<\/a> \u2014 C\u00f3digo fuente oficial y documentaci\u00f3n de funciones.<\/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\">Embalaje Python en 2025: Presentamos UV<\/a> \u2014 La descripci\u00f3n t\u00e9cnica de Franziska Hinkelmann sobre el dise\u00f1o y la filosof\u00eda de UV.<\/li>\n<li><a href=\"https:\/\/plotly.com\/blog\/uv-python-package-manager-quirks\/\" target=\"_blank\" rel=\"nofollow noopener\">Administrador de paquetes Python UV: Peculiaridades y Lecciones aprendidas<\/a> \u2014 La experiencia de adopci\u00f3n del mundo real de Plotly con UV.<\/li>\n<li><a href=\"https:\/\/www.kdnuggets.com\/python-project-setup-2026-uv-ruff-ty-polars\" target=\"_blank\" rel=\"nofollow noopener\">Configuraci\u00f3n del proyecto Python 2026: UV, Ruff, Ty, Polars<\/a> \u2014 Gu\u00eda de configuraci\u00f3n paso a paso para la pila moderna.<\/li>\n<li><a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">Manual TY<\/a> \u2014 Manual oficial que cubre las capacidades de TY, la garant\u00eda gradual y la integraci\u00f3n de c\u00f3digos VS.<\/li>\n<li><a href=\"https:\/\/www.resumelens.org\/blog\/python\/python-type-checkers-compared\" target=\"_blank\" rel=\"nofollow noopener\">comprobados de tipo python<\/a> \u2014 completo Comparaci\u00f3n de MyPy, Pyright, Ty y Pyre con datos de conformidad de especificaciones.<\/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\">Cambi\u00e9 de mypy a ty (46s \u2192 2.19s)<\/a> \u2014 Benchmark de verificaci\u00f3n de tipo en el mundo real en un c\u00f3digo de base de c\u00f3digo cient\u00edfico de Python.<\/li>\n<li><a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">Gu\u00eda de desarrollo de Python cient\u00edfico<\/a> \u2014 Recomendaciones oficiales de la comunidad para Ruff y Ty.<\/li>\n<\/ul>\n","protected":false,"raw":"<h2>Comida clave<\/h2>\n<ul>\n<li><strong>UV<\/strong> se ha convertido en el administrador de paquetes de Python predeterminado para la inform\u00e1tica cient\u00edfica, de 10 a 100 veces m\u00e1s r\u00e1pido que PIP, con archivos de bloqueo deterministas que hacen que los flujos de trabajo de investigaci\u00f3n sean reproducibles.<\/li>\n<li><strong>Ruff<\/strong> Reemplaza a Black, iSort, Flake8, PyUpgrade y Autoflake en un solo binario basado en \u00f3xido. Scipy, pandas y otras bibliotecas cient\u00edficas importantes lo usan hoy en d\u00eda.<\/li>\n<li><strong>ty<\/strong> (publicado en diciembre de 2025) es de 20 a 100 veces m\u00e1s r\u00e1pido que myPy y utiliza una garant\u00eda gradual que no romper\u00e1 el c\u00f3digo no anotado, ideal para migrar c\u00f3digos de investigaci\u00f3n.<\/li>\n<li><strong>PyProject.Toml<\/strong> es ahora la \u00fanica fuente de configuraci\u00f3n para toda la cadena de herramientas, reemplazando archivos de configuraci\u00f3n dispersos como <code>.flake8<\/code>, <code>.isort.cfg<\/code> y <code>mypy.ini<\/code>.<\/li>\n<li><strong>Para la computaci\u00f3n cient\u00edfica espec\u00edficamente<\/strong>, la conda sigue siendo necesaria para las dependencias que no son de Python (MPI, CUDA, HDF5) y Pyright sigue siendo la opci\u00f3n de CI m\u00e1s segura hasta que TY alcance la versi\u00f3n 1.0.<\/li>\n<\/ul>\n<p>Si est\u00e1 ejecutando flujos de trabajo cient\u00edficos de Python en 2026, su cadena de herramientas ha cambiado fundamentalmente. Los paquetes que utiliza para el c\u00e1lculo (numpy, scipy, fipy y el resto) son los mismos. Pero la forma en que los instala, administra, pelusa y marca los tipos es diferente de lo que la mayor\u00eda de los tutoriales, las gu\u00edas anteriores y los cuadernos de laboratorio universitarios a\u00fan recomiendan.<\/p>\n<p>Astral, la compa\u00f1\u00eda detr\u00e1s del linter (ruff) m\u00e1s popular de Python, construy\u00f3 tres herramientas que ahora cubren todo el flujo de trabajo del desarrollador: <strong>UV<\/strong> para la gesti\u00f3n de paquetes, <strong>ruff<\/strong> para el envio y el formato, y <strong>ty<\/strong> para la verificaci\u00f3n de tipos. Juntos, reemplazan a pip, venv, black, isort, flake8 y mypy. Son seis herramientas colapsadas en tres, todas configuradas a partir de un solo archivo <code>pyproject.toml<\/code>.<\/p>\n<p>Este art\u00edculo cubre la cadena cient\u00edfica moderna de herramientas Python en 2026. Explica qu\u00e9 hace cada herramienta, por qu\u00e9 ocurri\u00f3 el cambio y c\u00f3mo configurar todo, incluidas las peculiaridades y las limitaciones que importan para la computaci\u00f3n cient\u00edfica. Si est\u00e1 configurando un nuevo proyecto de simulaci\u00f3n, migrando una base de c\u00f3digo existente o poni\u00e9ndonos al d\u00eda despu\u00e9s de la gu\u00eda \"Ecosistema de Python cient\u00edfico\" (consulte el art\u00edculo <a href=\"https:\/\/matforge.org\/scientific-python-ecosystem-navigating-scipy-numpy-sympy-2\/\">#364<\/a>), esta es la actualizaci\u00f3n pr\u00e1ctica que necesita.<\/p>\n<h2>El moderno paisaje de herramientas<\/h2>\n<p>Hasta aproximadamente 2024, el flujo de trabajo de Scientific Python Developer se ve\u00eda as\u00ed:<\/p>\n<ul>\n<li><strong>Gesti\u00f3n de paquetes<\/strong>: pip con pip-tools o poes\u00eda<\/li>\n<li><strong>Entornos virtuales<\/strong>: Venv o VirtualEnV<\/li>\n<li><strong>Administraci\u00f3n de versiones de Python<\/strong>: PYENV o PYENV-VirtualEnv<\/li>\n<li><strong>linting<\/strong>: Flake8, luego PydocStyle, m\u00e1s Pylint para verificaciones de estilo<\/li>\n<li><strong>Formatear<\/strong>: negro e iSort (y posteriormente, AutoPep8 y PyUpgrade)<\/li>\n<li><strong>Comprobaci\u00f3n de tipo<\/strong>: myPy<\/li>\n<\/ul>\n<p>Eso signific\u00f3 instalar seis paquetes de Python separados, mantener archivos de configuraci\u00f3n separados y esperar a trav\u00e9s de pasos de resoluci\u00f3n secuenciales. Un simple <code>pip install<\/code> podr\u00eda tomar minutos. Ejecuci\u00f3n negra, luego isort, luego flake8, luego mypy podr\u00eda tomar m\u00e1s tiempo.<\/p>\n<p>El cambio comenz\u00f3 cuando Astral lanz\u00f3 Ruff en 2023. Ruff se escribi\u00f3 en \u00f3xido, dise\u00f1ado para reemplazar negro, iSort, Flake8, PyUpgrade y Autoflake simult\u00e1neamente, y corri\u00f3 \u00f3rdenes de magnitud m\u00e1s r\u00e1pido que las alternativas basadas en Python. Ese \u00e9xito en la adopci\u00f3n le dio a Astral el impulso para construir un ecosistema completo: UV para la gesti\u00f3n de paquetes y TY para la verificaci\u00f3n de tipos.<\/p>\n<p>A fines de 2025 y principios de 2026, la convergencia estaba completa. El <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">gu\u00eda cient\u00edfica de desarrollo de Python<\/a> ahora recomienda oficialmente Ruff para verificaciones de estilo y ty para verificaci\u00f3n de tipo. Scipy y Pandas han adoptado Ruff. UV ha superado la poes\u00eda en adopci\u00f3n entre los equipos de computaci\u00f3n cient\u00edfica. La pila anterior no est\u00e1 muerta, todav\u00eda funciona, pero ya no es la predeterminada para nuevos proyectos.<\/p>\n<h3>Por qu\u00e9 es importante PyProject.toml<\/h3>\n<p>Uno de los mayores cambios pr\u00e1cticos es el modelo de configuraci\u00f3n. La antigua configuraci\u00f3n de pila dispersa en cinco o m\u00e1s archivos:<\/p>\n<ul>\n<li><code>.flake8<\/code> Para las reglas de pelusa<\/li>\n<li><code>.isort.cfg<\/code> para la clasificaci\u00f3n de importaci\u00f3n<\/li>\n<li><code>mypy.ini<\/code> para el comportamiento de verificaci\u00f3n de tipo<\/li>\n<li><code>setup.cfg<\/code> para los metadatos del paquete<\/li>\n<li><code>pyproject.toml<\/code> (parcialmente, para sistemas de construcci\u00f3n)<\/li>\n<\/ul>\n<p>Las herramientas modernas centralizan todo en <code>pyproject.toml<\/code>. Un solo archivo define el paquete, las dependencias, las herramientas de desarrollo y la configuraci\u00f3n de la herramienta. Esto hace que los proyectos sean m\u00e1s f\u00e1ciles de compartir, clonar y mantener, exactamente lo que necesitan los equipos de investigaci\u00f3n cuando publican c\u00f3digo o incorporan a nuevos estudiantes.<\/p>\n<h2>UV: gesti\u00f3n de paquetes que realmente funciona<\/h2>\n<p><code>uv<\/code> es un administrador de paquetes basado en \u00f3xido construido por Astral. Reemplaza PIP, PIP-Tools, PiPX, PYENV y VirtualEnv en un solo binario r\u00e1pido. A diferencia de PIP, <code>uv<\/code> no requiere que Python se instale primero: puede iniciar un int\u00e9rprete de Python y administrar versiones junto con las dependencias.<\/p>\n<h3>Por qu\u00e9 los investigadores est\u00e1n cambiando<\/h3>\n<p>Las principales razones por las que los investigadores y desarrolladores eligen <code>uv<\/code>:<\/p>\n<ol>\n<li><strong>Velocidad<\/strong>. <code>uv<\/code> instala paquetes de 10 a 100 veces m\u00e1s r\u00e1pido que PIP, principalmente a trav\u00e9s de resoluci\u00f3n paralela y almacenamiento en cach\u00e9 agresivo. Esto importa en las canalizaciones de CI donde el tiempo de instalaci\u00f3n afecta directamente a la respuesta del desarrollador.<\/li>\n<li><strong>Archivos de bloqueo<\/strong>. Un solo archivo <code>uv.lock<\/code> registra versiones resueltas exactas de cada dependencia, incluidas las subdependencias. Comprometer este archivo a Git hace que su entorno sea completamente reproducible, un requisito para las simulaciones publicadas.<\/li>\n<li><strong>Gesti\u00f3n de versiones de Python<\/strong>. <code>uv<\/code> Puede descargar y administrar int\u00e9rpretes de Python, eliminando la necesidad de herramientas separadas como PYENV.<\/li>\n<li><strong>Compatibilidad PIP<\/strong>. Los comandos como <code>uv pip install<\/code> funcionan con <code>requirements.txt<\/code>, lo que simplifica la migraci\u00f3n de los proyectos existentes.<\/li>\n<\/ol>\n<h3>Configuraci\u00f3n de UV<\/h3>\n<p>El flujo de trabajo t\u00edpico para un nuevo proyecto cient\u00edfico de Python se ve as\u00ed:<\/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> Se instala desde el archivo de bloqueo, asegurando reproducciones deterministas. Cualquiera que clone el repositorio y ejecute <code>uv sync<\/code> obtiene exactamente las mismas versiones resueltas.<\/p>\n<h3>La peculiaridad de compilaci\u00f3n de c\u00f3digo de bytes<\/h3>\n<p>Aqu\u00ed es donde <code>uv<\/code> se comporta de manera diferente a PIP, y donde los equipos de computaci\u00f3n cient\u00edfica han golpeado muros inesperados.<\/p>\n<p><code>uv<\/code> Difiere la compilaci\u00f3n de c\u00f3digo de bytes a la primera ejecuci\u00f3n. Cuando <code>uv<\/code> instala un paquete, almacena c\u00f3digo de bytes precompilado en una cach\u00e9 pero no compila todos los archivos de inmediato. Esto hace que las instalaciones <code>uv<\/code> sean aproximadamente de 3 a 4 veces m\u00e1s r\u00e1pidas que PIP. Sin embargo, la primera importaci\u00f3n de una biblioteca (especialmente numpy o scipy) puede ser aproximadamente 2,5 veces m\u00e1s lenta que una copia instalada en PIP, porque el c\u00f3digo de byte se compila en el momento de la importaci\u00f3n.<\/p>\n<p>Para el desarrollo interactivo, esta desaceleraci\u00f3n suele ser imperceptible. Para las canalizaciones de CI, los scripts de trabajo de HPC o los servidores de producci\u00f3n que importan Numpy o Scipy en cada ejecuci\u00f3n, la peculiaridad importa. La soluci\u00f3n es simple: agregue <code>--compile-bytecode<\/code> a su comando de sincronizaci\u00f3n.<\/p>\n<p><em>Contexto del mundo real: el equipo de datos de Plotly document\u00f3 este problema exacto despu\u00e9s de adoptar <code>uv<\/code> en producci\u00f3n. Sus servidores de producci\u00f3n vieron importaciones numpy notablemente m\u00e1s lentas hasta que agregaron la bandera. Vea la publicaci\u00f3n de <a href=\"https:\/\/plotly.com\/blog\/uv-python-package-manager-quirks\/\" target=\"_blank\" rel=\"nofollow noopener\">Party de Plotly sobre las peculiaridades UV<\/a> para conocer el desglose t\u00e9cnico completo.<\/em><\/p>\n<h3>El comportamiento de \u00edndice exclusivo<\/h3>\n<p><code>uv<\/code> Trata <code>--extra-index-url<\/code> entradas exclusivas de forma predeterminada, despu\u00e9s de PEP 0708. Esto significa que si existe un paquete en su \u00edndice principal, <code>uv<\/code> nunca comprobar\u00e1 el \u00edndice adicional. Esto protege contra los ataques de dependencia: un actor malintencionado no puede reemplazar un paquete alojado en un \u00edndice bien conocido con un espejo comprometido. Pero tambi\u00e9n rompe las tuber\u00edas existentes <code>requirements.txt<\/code> que dependen de \u00edndices adicionales para los paquetes alternativos.<\/p>\n<p>Si su laboratorio usa un \u00edndice de paquete privado o un \u00edndice compatible con CONDA, deber\u00e1 configurar expl\u00edcitamente el <code>index-strategy<\/code> en <code>pyproject.toml<\/code>. Sin esa configuraci\u00f3n, <code>uv<\/code> puede no resolver los paquetes que espera encontrar en el \u00edndice adicional.<\/p>\n<h3>Cuando los rayos UV no son suficientes<\/h3>\n<p><code>uv<\/code> Administra paquetes de Python e int\u00e9rpretes de Python. No administra las dependencias del sistema que no son de Python: bibliotecas C y C++, compiladores Fortran, kits de herramientas MPI, CUDA, HDF5, FFTW o bibliotecas de gr\u00e1ficos.<\/p>\n<p>Para esas dependencias, Conda sigue siendo el est\u00e1ndar. El patr\u00f3n recomendado es usar <code>uv<\/code> para paquetes de Python y conda (o PIXI) para dependencias a nivel de sistema. Muchos equipos cient\u00edficos emparejan las dos herramientas: conda para la pila del sistema, <code>uv<\/code> para la capa de Python.<\/p>\n<p>Si su proyecto involucra dependencias que no son de Python como MPI, CUDA o HDF5, consulte la gu\u00eda relacionada sobre <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Administraci\u00f3n de dependencias en Python cient\u00edfico<\/a>, que cubre la conda, los archivos de bloqueo y cu\u00e1ndo usar cada herramienta.<\/p>\n<h2>Ruff: el linter que reemplaza a seis herramientas<\/h2>\n<p>Ruff es un linter y formateador basados en \u00f3xido construido por Astral. Reemplaza a Black (Formateando), iSort (Import ordenar), Flake8 (comprobaciones de estilo), PyUpgrade (eliminaci\u00f3n de c\u00f3digo muerto) y Autoflake (eliminaci\u00f3n de variables no utilizadas) en un solo binario que se ejecuta de 10 a 100 veces m\u00e1s r\u00e1pido que la pila anterior combinada.<\/p>\n<p>Eso lo hace especialmente atractivo para la inform\u00e1tica cient\u00edfica, donde las grandes bases de c\u00f3digo con versiones mixtas de Python y m\u00f3dulos heredados pueden tardar varios segundos en verse con las herramientas tradicionales. Ruff lo hace en milisegundos.<\/p>\n<h3>Las bibliotecas cient\u00edficas ya usan Ruff<\/h3>\n<p>Ruff ya no es solo un linter de marco web. Las principales bibliotecas cient\u00edficas lo han adoptado:<\/p>\n<ul>\n<li><strong>scipy<\/strong> \u2014 El equipo central de la biblioteca de m\u00e9todos num\u00e9ricos migr\u00f3 a Ruff.<\/li>\n<li><strong>Pandas<\/strong>: utiliza Ruff para la aplicaci\u00f3n del estilo en toda la base de c\u00f3digo.<\/li>\n<li><strong>Fastapi<\/strong> y <strong>cara de abrazo<\/strong>: ambos usan Ruff como su \u00fanico formateador y linter.<\/li>\n<\/ul>\n<p>Esta adopci\u00f3n es importante porque se\u00f1ala que Ruff maneja los casos extremos de c\u00f3digo cient\u00edfico (cadenas de documentaci\u00f3n largas, anotaciones de tipo complejo, importaciones heredadas de estilo Python-2) sin perder la correcci\u00f3n ni introducir errores de formato. La documentaci\u00f3n oficial de Ruff enumera las tres bibliotecas como adoptantes. Consulte los <a href=\"https:\/\/astral.sh\/ruff\/\" target=\"_blank\" rel=\"nofollow noopener\">documentos oficiales de Ruff<\/a> para obtener la lista completa.<\/p>\n<h3>Configuraci\u00f3n<\/h3>\n<p>Ruff se configura completamente desde <code>pyproject.toml<\/code>:<\/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>La matriz <code>select<\/code> especifica qu\u00e9 conjuntos de reglas habilitar. <code>E<\/code> y <code>F<\/code> cubren los errores de PEP 8 y las comprobaciones de los copos de Py. <code>I<\/code> Maneja la clasificaci\u00f3n de importaciones (reemplazando isort). <code>N<\/code> Hace cumplir las convenciones de nomenclatura. <code>UP<\/code> Ejecuta la modernizaci\u00f3n del estilo PyUpgrade. <code>RUF<\/code> Agrega reglas espec\u00edficas de Ruff. La l\u00ednea <code>ignore<\/code> elimina E501 (l\u00ednea demasiado larga) porque Ruff delega la longitud de la l\u00ednea al formateador, manteniendo el linter r\u00e1pido.<\/p>\n<h3>Migraci\u00f3n desde negro + iSort + Flake8<\/h3>\n<p>Eliminar la pila antigua es sencillo. Despu\u00e9s de instalar Ruff, puede reemplazar los comandos:<\/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> Maneja todas las comprobaciones de estilo. <code>ruff format<\/code> Maneja todo el formato. Son dos comandos en lugar de cuatro, ejecutando un binario en lugar de cuatro separados.<\/p>\n<p>La Gu\u00eda de Desarrollo Cient\u00edfico de Python recomienda expl\u00edcitamente migrar de Flake8 a Ruff para verificaciones de estilo. Consulte <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">su gu\u00eda de seguridad y desarrollo<\/a> para conocer la recomendaci\u00f3n oficial.<\/p>\n<h2>TY: Comprobaci\u00f3n de tipo sin dolor<\/h2>\n<p><code>ty<\/code> es el verificador de tipo de pr\u00f3xima generaci\u00f3n de Astral, lanzado en diciembre de 2025. Reemplaza a myPy como el verificador de tipo est\u00e1tico recomendado en el ecosistema astral. Est\u00e1 escrito en \u00f3xido y dise\u00f1ado para ser r\u00e1pido, estricto por defecto y compatible con c\u00f3digo no anotado.<\/p>\n<h3>La victoria de la velocidad<\/h3>\n<p>La ventaja m\u00e1s dram\u00e1tica de Ty es la velocidad. En un punto de referencia del mundo real de un usuario que migr\u00f3 de mypy a ty en una base de c\u00f3digo de Python cient\u00edfico real, mypy tom\u00f3 <strong>46 segundos<\/strong> y Ty complet\u00f3 el mismo cheque en <strong>2.19 segundos<\/strong>, aproximadamente 20 veces m\u00e1s r\u00e1pido. Consulte el punto de referencia completo en <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\">La publicaci\u00f3n de migraci\u00f3n de StackAdemic<\/a>.<\/p>\n<p>Esto importa porque la verificaci\u00f3n de tipos suele ser el paso de CI m\u00e1s largo en un flujo de trabajo de Python. Reducir 46 segundos a 2,2 segundos reduce los tiempos de cola de CI, permite a los desarrolladores obtener comentarios m\u00e1s r\u00e1pidos y hace que la verificaci\u00f3n de tipo completa sea factible en las ramas, donde incluso se habr\u00edan omitido los verificadores de tipo lento.<\/p>\n<h3>La garant\u00eda gradual<\/h3>\n<p>A diferencia de mypy, Ty implementa una <strong>garant\u00eda gradual<\/strong>: no aparecer\u00e1 errores en el c\u00f3digo que no tiene anotaciones. Si un m\u00f3dulo contiene <code>def calculate(x, y): return x + y<\/code> sin sugerencias de tipo, Ty lo trata como no escrito y no se queja de que faltan anotaciones. Esto es ideal para migrar bases de c\u00f3digos cient\u00edficos que tienen m\u00f3dulos parcialmente tipificados, un patr\u00f3n com\u00fan en el c\u00f3digo de investigaci\u00f3n donde se escribe el motor de simulaci\u00f3n central, pero los scripts y cuadernos auxiliares no lo son.<\/p>\n<p><a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">el manual oficial de TY<\/a> explica la garant\u00eda gradual en detalle. El punto clave es que agregar anotaciones de tipo a un m\u00f3dulo no hace que TY informe errores en ese m\u00f3dulo; solo informa errores en el c\u00f3digo ya escrito. MyPy hace lo contrario: informa errores en cualquier funci\u00f3n no anotada que encuentra, lo que rompe las bases de c\u00f3digo existentes que carecen de anotaciones completas.<\/p>\n<h3>Conformidad de especificaciones: la compensaci\u00f3n<\/h3>\n<p>Aqu\u00ed est\u00e1 la compensaci\u00f3n que debe comprender antes de poner ty en CI.<\/p>\n<p>De acuerdo con <a href=\"https:\/\/www.resumelens.org\/blog\/python\/python-type-checkers-compared\" target=\"_blank\" rel=\"nofollow noopener\">una comparaci\u00f3n completa de mypy, Pyright, Ty y Pyre<\/a>, la conformidad de especificaciones de tipo Python de Ty se encuentra en aproximadamente <strong>53 por ciento<\/strong>, mientras que Pyright logra aproximadamente <strong>98 por ciento<\/strong> y mypy alcanza aproximadamente <strong>58 por ciento<\/strong>. Esto significa que TY cubre solo la mitad de las caracter\u00edsticas de las especificaciones de escritura, y puede pasar por alto los casos de Pyright que detecta.<\/p>\n<p>Hasta que TY llegue a la versi\u00f3n 1.0, la estrategia de CI recomendada es un enfoque de dos capas:<\/p>\n<ol>\n<li><strong>Desarrollo local<\/strong>: use ty para comentarios r\u00e1pidos (verificaciones de 2 segundos).<\/li>\n<li><strong>Tipelines de CI<\/strong>: use Pyright para una cobertura de especificaciones completa (capta los errores).<\/li>\n<\/ol>\n<p>Esto le da velocidad y correcci\u00f3n. Una vez que Ty llega a 1.0 y su conformidad de especificaciones mejora, puede confiar solo en Ty para CI.<\/p>\n<h3>Configuraci\u00f3n<\/h3>\n<p>ty configura desde <code>pyproject.toml<\/code>:<\/p>\n<pre><code class=\"language-toml\">[tool.typer]\npython-version = \"3.11\"\nstrict = true\n<\/code><\/pre>\n<p>El indicador <code>strict<\/code> habilita todas las comprobaciones de modo estricto (columna impl\u00edcita, no-def sin tipo, etc.). Consulte <a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">El manual de TY<\/a> para obtener la referencia de configuraci\u00f3n completa.<\/p>\n<h2>Gu\u00eda de migraci\u00f3n: de pila antigua a nueva<\/h2>\n<p>Aqu\u00ed est\u00e1 la comparaci\u00f3n pr\u00e1ctica de antes y despu\u00e9s. Si actualmente est\u00e1 utilizando pip, venv, negro, isort, flake8 y mypy, esta tabla muestra exactamente qu\u00e9 reemplaza a cada herramienta.<\/p>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Tarea<\/th>\n<th>Pila antigua (2023 y anteriores)<\/th>\n<th>Pila moderna (2025-2026)<\/th>\n<th>notas<\/th>\n<\/tr>\n<tr>\n<td>Administrador de paquetes<\/td>\n<td>pepita<\/td>\n<td>UV<\/td>\n<td>10-100 \u00d7 instalaciones m\u00e1s r\u00e1pidas, archivos de bloqueo incluidos<\/td>\n<\/tr>\n<tr>\n<td>Entornos virtuales<\/td>\n<td>Venv \/ VirtualEnv<\/td>\n<td>Construido en UV<\/td>\n<td>UV gestiona venvs autom\u00e1ticamente<\/td>\n<\/tr>\n<tr>\n<td>Gesti\u00f3n de versiones de Python<\/td>\n<td>Pyenv \/ Pyenv-VirtualEnv<\/td>\n<td>Construido en UV<\/td>\n<td>UV descargas int\u00e9rpretes bajo demanda<\/td>\n<\/tr>\n<tr>\n<td>peluquer\u00eda de estilo<\/td>\n<td>Flake8, PydocStyle<\/td>\n<td>Fallar<\/td>\n<td>Ruff reemplaza ambos en un binario<\/td>\n<\/tr>\n<tr>\n<td>formateo<\/td>\n<td>Negro<\/td>\n<td>Ruff (formato de Ruff)<\/td>\n<td>La misma salida que el negro en la mayor\u00eda de los casos<\/td>\n<\/tr>\n<tr>\n<td>Clasificaci\u00f3n de importaci\u00f3n<\/td>\n<td>iSort<\/td>\n<td>Ruff (verificaci\u00f3n de Ruff --fix)<\/td>\n<td>Construido en las reglas de pelusa de Ruff<\/td>\n<\/tr>\n<tr>\n<td>Comprobaci\u00f3n de tipo<\/td>\n<td>mipy<\/td>\n<td>Ty (local), Pyright (IC)<\/td>\n<td>Ty es 20 \u00d7 m\u00e1s r\u00e1pido; Pyright atrapa a Ty fallas<\/td>\n<\/tr>\n<tr>\n<td>Configuraci\u00f3n<\/td>\n<td>5+ archivos de configuraci\u00f3n dispersos<\/td>\n<td>solo pyproject.toml<\/td>\n<td>Todas las herramientas le\u00eddas de un archivo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Migraci\u00f3n paso a paso<\/h3>\n<p>Aqu\u00ed est\u00e1 la ruta de migraci\u00f3n concreta para un proyecto existente:<\/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>Esta ruta funciona porque la salida de Ruff es casi id\u00e9ntica al estilo de formato de Black, por lo que el c\u00f3digo formateado parece familiar. La garant\u00eda gradual de TY significa que no romper\u00e1 los m\u00f3dulos no anotados durante la migraci\u00f3n. Puede agregar anotaciones de tipo de forma incremental sin temor a que Ty supere los errores en el c\u00f3digo que a\u00fan no ha escrito.<\/p>\n<p>Si su proyecto se basa en <code>requirements.txt<\/code>, tenga en cuenta que <code>uv<\/code> puede instalar desde <code>uv pip install -r requirements.txt<\/code>. Pero para la reproducibilidad a largo plazo, genere un archivo <code>uv.lock<\/code> y aleje de <code>requirements.txt<\/code>. Consulte la gu\u00eda relacionada sobre <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gesti\u00f3n de dependencias en Scientific Python<\/a> para obtener m\u00e1s informaci\u00f3n sobre archivos de bloqueo y reproducibilidad.<\/p>\n<h2>Lo que recomendamos: Un marco de decisi\u00f3n<\/h2>\n<p>No todos los equipos deben adoptar las tres herramientas simult\u00e1neamente. La pila correcta depende de los requisitos de su proyecto. Utilice este marco de decisi\u00f3n para elegir:<\/p>\n<ol>\n<li><strong>\u00bfNecesita dependencias que no sean de Python?<\/strong> (MPI, CUDA, HDF5, C++ Bibliotecas, compiladores Fortran) <ul> <li><strong>S\u00ed<\/strong>: use conda para esas dependencias. Todav\u00eda puede usar <code>uv<\/code> para los paquetes de Python junto con Conda.<\/li> <li><strong>No<\/strong>: Contin\u00fae con la siguiente pregunta.<\/li> <\/ul><\/li>\n<li><strong>\u00bfEst\u00e1s publicando un paquete de Python en PYPI?<\/strong> <ul> <li><strong>s\u00ed<\/strong>: Considere poes\u00eda para maduro Publicaci\u00f3n de flujos de trabajo, o <code>uv<\/code> para instalaciones m\u00e1s r\u00e1pidas durante el desarrollo. Ambos soportan la publicaci\u00f3n PYPI.<\/li> <li><strong>no<\/strong>: <code>uv<\/code> es la opci\u00f3n predeterminada Proyectos.<\/li> <\/ul><\/li>\n<li><strong>\u00bfEst\u00e1s trabajando en canalizaciones CI\/CD donde importa el tiempo de instalaci\u00f3n?<\/strong> <ul> <li><strong>S\u00ed<\/strong> <code>uv<\/code>. Las ganancias de velocidad (10-100\u00d7 sobre PIP) reducen directamente los tiempos de cola de CI.<\/li> <li><strong>No<\/strong>: <code>uv<\/code> o la poes\u00eda puede funcionar dependiendo de la familiaridad del equipo.<\/li> <\/ul><\/li>\n<li><strong>\u00bfQu\u00e9 tan importante es la cobertura de especificaciones de verificaci\u00f3n de tipo completa en CI?<\/strong> <ul> <li><strong>High<\/strong>: use pyright para CI, ty para el desarrollo local. Esto te da velocidad y correcci\u00f3n.<\/li> <li><strong>bajo<\/strong>: Ty solo es suficiente para la mayor\u00eda de las bases de c\u00f3digo de investigaci\u00f3n.<\/li> <\/ul><\/li>\n<\/ol>\n<p>Para la mayor\u00eda de los nuevos proyectos de investigaci\u00f3n, la pila recomendada es:<\/p>\n<ul>\n<li><strong>UV<\/strong> para la gesti\u00f3n de paquetes y los archivos de bloqueo<\/li>\n<li><strong>ruff<\/strong> para pelusas y formatear<\/li>\n<li><strong>ty<\/strong> para la verificaci\u00f3n de tipo local (comentarios r\u00e1pidos)<\/li>\n<li><strong>Pyright<\/strong> para la verificaci\u00f3n de tipo CI (cobertura completa de especificaciones)<\/li>\n<\/ul>\n<p>Esa combinaci\u00f3n le da velocidad, correcci\u00f3n y reproducibilidad: los tres pilares de la calidad del software de investigaci\u00f3n.<\/p>\n<h2>Limitaciones: Cu\u00e1ndo quedarse con las herramientas antiguas<\/h2>\n<p>La pila moderna es poderosa, pero no es un reemplazo universal. Aqu\u00ed es cuando debes mantener las herramientas antiguas:<\/p>\n<h3>Conda para dependencias que no son de Python<\/h3>\n<p>UV administra paquetes de Python e int\u00e9rpretes de Python. No maneja bibliotecas C compiladas, compiladores Fortran, MPI, CUDA Toolkits, HDF5, FFTW o bibliotecas de gr\u00e1ficos. Para ellos, CONDA (o PIXI) sigue siendo el est\u00e1ndar de la computaci\u00f3n cient\u00edfica. Muchos equipos usan conda para las dependencias del sistema y <code>uv<\/code> para los paquetes de Python en el mismo entorno.<\/p>\n<h3>mypy para una cobertura de especificaciones completa<\/h3>\n<p>Hasta que TY alcance la versi\u00f3n 1.0 y cierre su brecha de conformidad de especificaciones, mypy o pyright es la opci\u00f3n m\u00e1s segura para entornos CI que necesitan una cobertura de verificaci\u00f3n de tipo completa. Use ty para el desarrollo local donde la velocidad importa y el pyright (o mypy) para CI donde la correcci\u00f3n importa.<\/p>\n<h3>Poes\u00eda para Pypi<\/h3>\n<p>Si publica paquetes cient\u00edficos de Python en PYPI, la poes\u00eda todav\u00eda tiene flujos de trabajo de publicaci\u00f3n maduros, grupos de dependencias y una canalizaci\u00f3n de compilaci\u00f3n bien documentada. <code>uv<\/code> Admite la publicaci\u00f3n PYPI, pero sus flujos de trabajo son m\u00e1s nuevos y menos documentados que los de la poes\u00eda. Si su equipo valora la documentaci\u00f3n establecida y los largos registros de producci\u00f3n, la poes\u00eda a\u00fan puede ser la mejor opci\u00f3n para el lado de la publicaci\u00f3n de su flujo de trabajo.<\/p>\n<h2>Resumen y pr\u00f3ximos pasos<\/h2>\n<p>La cadena de herramientas cient\u00edfica Python ha madurado. La pila de \u00f3xido (UV, Ruff y Ty) reemplaza las viejas herramientas fragmentadas con algo m\u00e1s r\u00e1pido, simple y mejor integrado. Aqu\u00ed est\u00e1n las comidas para llevar:<\/p>\n<ol>\n<li><strong>UV<\/strong> es el administrador de paquetes predeterminado para nuevos proyectos. Utilice <code>--compile-bytecode<\/code> en servidores y canalizaciones de CI. Use conda junto con ella para dependencias que no son de Python.<\/li>\n<li><strong>ruff<\/strong> reemplaza negro, isort, flake8, pyupgrade y autoflake. Scipy y Pandas ya lo usan. Configure todo desde <code>pyproject.toml<\/code>.<\/li>\n<li><strong>ty<\/strong> es el verificador de tipo m\u00e1s r\u00e1pido disponible: 20\u00d7 m\u00e1s r\u00e1pido que mypy. \u00daselo localmente. Use Pyright para CI hasta que Ty llegue a 1.0.<\/li>\n<li><strong>PyProject.Toml<\/strong> es la \u00fanica fuente de configuraci\u00f3n. Las tres herramientas le\u00eddas de \u00e9l. No m\u00e1s archivos de configuraci\u00f3n dispersos.<\/li>\n<\/ol>\n<p>Si est\u00e1 iniciando un nuevo proyecto de simulaci\u00f3n, adopte la pila moderna desde el primer d\u00eda. Si est\u00e1 migrando un proyecto existente, siga la ruta paso a paso anterior: la salida de formato de Ruff es casi id\u00e9ntica a la de Black, y la garant\u00eda gradual de Ty significa que no romper\u00e1 el c\u00f3digo existente durante la transici\u00f3n.<\/p>\n<p>Para un contexto m\u00e1s amplio en la pila de la biblioteca cient\u00edfica Python que se encuentra encima de esta herramienta, consulte la <a href=\"https:\/\/matforge.org\/scientific-python-ecosystem-navigating-scipy-numpy-sympy-2\/\" target=\"_blank\" rel=\"nofollow noopener\">Gu\u00eda del ecosistema de Python cient\u00edfico<\/a>, que cubre Numpy, Scipy, Sympy, Matplotlib, Jupyter y Scikit-aprender. Para obtener una cobertura m\u00e1s profunda de la gesti\u00f3n de dependencias y los archivos de bloqueo, consulte la gu\u00eda <a href=\"https:\/\/matforge.org\/managing-dependencies-scientific-python-lockfiles-environments\/\" target=\"_blank\" rel=\"nofollow noopener\">Gestionar dependencias en Scientific Python<\/a>. Y para las mejores pr\u00e1cticas de mantenimiento que combinan bien con la cadena de herramientas moderna, lea la gu\u00eda <a href=\"https:\/\/matforge.org\/best-practices-for-maintaining-scientific-code\/\" target=\"_blank\" rel=\"nofollow noopener\">Mejores pr\u00e1cticas para mantener el c\u00f3digo cient\u00edfico<\/a>.<\/p>\n<p>El ecosistema cient\u00edfico de Python no va a ninguna parte. Pero la forma en que trabaja con \u00e9l ha cambiado, y la adopci\u00f3n de la pila moderna le brinda compilaciones m\u00e1s r\u00e1pidas, una configuraci\u00f3n m\u00e1s simple y una mejor reproducibilidad, todo sin cambiar las bibliotecas que usa para el c\u00e1lculo.<\/p>\n<p><!-- Referencias y lecturas adicionales --><\/p>\n<h2>Referencias y lectura adicional<\/h2>\n<ul>\n<li><a href=\"https:\/\/astral.sh\/ruff\/\" target=\"_blank\" rel=\"nofollow noopener\">Documentaci\u00f3n de Ruff<\/a> \u2014 Gu\u00eda oficial del linter y formateador basados en \u00f3xido.<\/li>\n<li><a href=\"https:\/\/github.com\/astral-sh\/uv\" target=\"_blank\" rel=\"nofollow noopener\">Repositorio de UV GitHub<\/a> \u2014 C\u00f3digo fuente oficial y documentaci\u00f3n de funciones.<\/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\">Embalaje Python en 2025: Presentamos UV<\/a> \u2014 La descripci\u00f3n t\u00e9cnica de Franziska Hinkelmann sobre el dise\u00f1o y la filosof\u00eda de UV.<\/li>\n<li><a href=\"https:\/\/plotly.com\/blog\/uv-python-package-manager-quirks\/\" target=\"_blank\" rel=\"nofollow noopener\">Administrador de paquetes Python UV: Peculiaridades y Lecciones aprendidas<\/a> \u2014 La experiencia de adopci\u00f3n del mundo real de Plotly con UV.<\/li>\n<li><a href=\"https:\/\/www.kdnuggets.com\/python-project-setup-2026-uv-ruff-ty-polars\" target=\"_blank\" rel=\"nofollow noopener\">Configuraci\u00f3n del proyecto Python 2026: UV, Ruff, Ty, Polars<\/a> \u2014 Gu\u00eda de configuraci\u00f3n paso a paso para la pila moderna.<\/li>\n<li><a href=\"https:\/\/pydevtools.com\/handbook\/topics\/ty\/\" target=\"_blank\" rel=\"nofollow noopener\">Manual TY<\/a> \u2014 Manual oficial que cubre las capacidades de TY, la garant\u00eda gradual y la integraci\u00f3n de c\u00f3digos VS.<\/li>\n<li><a href=\"https:\/\/www.resumelens.org\/blog\/python\/python-type-checkers-compared\" target=\"_blank\" rel=\"nofollow noopener\">comprobados de tipo python<\/a> \u2014 completo Comparaci\u00f3n de MyPy, Pyright, Ty y Pyre con datos de conformidad de especificaciones.<\/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\">Cambi\u00e9 de mypy a ty (46s \u2192 2.19s)<\/a> \u2014 Benchmark de verificaci\u00f3n de tipo en el mundo real en un c\u00f3digo de base de c\u00f3digo cient\u00edfico de Python.<\/li>\n<li><a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/security\/\" target=\"_blank\" rel=\"nofollow noopener\">Gu\u00eda de desarrollo de Python cient\u00edfico<\/a> \u2014 Recomendaciones oficiales de la comunidad para Ruff y 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>Aprenda la cadena cient\u00edfica moderna de Python Toolchain: UV para la gesti\u00f3n de paquetes, Ruff para pelusas y TY para la verificaci\u00f3n de tipos. Actualizado para 2026 con puntos de referencia y gu\u00edas de migraci\u00f3n.<\/p>\n","protected":false,"raw":"Aprenda la cadena cient\u00edfica moderna de Python Toolchain: UV para la gesti\u00f3n de paquetes, Ruff para pelusas y TY para la verificaci\u00f3n de tipos. Actualizado para 2026 con puntos de referencia y gu\u00edas de migraci\u00f3n."},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"es_ES","_original_post":"https:\/\/matforge.org\/?p=1051","iawp_total_views":0,"footnotes":""},"categories":[1],"tags":[72,73,71,68,16,70,69],"class_list":["post-1106","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","es-ES"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y 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\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y Ty - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  14 minutesAprenda la cadena cient\u00edfica moderna de Python Toolchain: UV para la gesti\u00f3n de paquetes, Ruff para pelusas y TY para la verificaci\u00f3n de tipos. Actualizado para 2026 con puntos de referencia y gu\u00edas de migraci\u00f3n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/es\/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-19T09:48:36+00:00\" \/>\n<meta name=\"author\" content=\"steven\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"steven\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\"},\"author\":{\"name\":\"steven\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"headline\":\"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y Ty\",\"datePublished\":\"2026-08-19T09:48:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\"},\"wordCount\":3917,\"commentCount\":0,\"keywords\":[\"Astral\",\"Python package manager\",\"Python tooling\",\"Ruff\",\"scientific python\",\"type checking\",\"uv\"],\"articleSection\":[\"Simulaci\u00f3n &amp; Proyectos de modelado\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\",\"name\":\"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y Ty - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-19T09:48:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/modern-scientific-python-tooling-uv-ruff-type-checking\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y 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\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\",\"name\":\"steven\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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":"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y 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\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/","og_locale":"es_ES","og_type":"article","og_title":"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y Ty - matforge.org","og_description":"Reading Time:  14 minutesAprenda la cadena cient\u00edfica moderna de Python Toolchain: UV para la gesti\u00f3n de paquetes, Ruff para pelusas y TY para la verificaci\u00f3n de tipos. Actualizado para 2026 con puntos de referencia y gu\u00edas de migraci\u00f3n.","og_url":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/","og_site_name":"matforge.org","article_published_time":"2026-08-19T09:48:36+00:00","author":"steven","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"steven","Tiempo de lectura":"21 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/"},"author":{"name":"steven","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"headline":"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y Ty","datePublished":"2026-08-19T09:48:36+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/"},"wordCount":3917,"commentCount":0,"keywords":["Astral","Python package manager","Python tooling","Ruff","scientific python","type checking","uv"],"articleSection":["Simulaci\u00f3n &amp; Proyectos de modelado"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/","url":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/","name":"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y Ty - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-19T09:48:36+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"breadcrumb":{"@id":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/es\/modern-scientific-python-tooling-uv-ruff-type-checking\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/es\/"},{"@type":"ListItem","position":2,"name":"Herramienta de pit\u00f3n cient\u00edfica moderna en 2026: UV, Ruff y 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":"es"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03","name":"steven","image":{"@type":"ImageObject","inLanguage":"es","@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\/1106","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=1106"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1106\/revisions"}],"predecessor-version":[{"id":1150,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1106\/revisions\/1150"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}