<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Importaciones el josiete.com</title><link>https://www.josiete.com/tags/importaciones/</link><description>Contenido reciente en Importaciones el josiete.com</description><generator>Hugo</generator><language>es-es</language><lastBuildDate>Tue, 20 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.josiete.com/tags/importaciones/index.xml" rel="self" type="application/rss+xml"/><item><title>Python 3.15: importar solo cuando hace falta</title><link>https://www.josiete.com/posts/python-explicit-lazy-imports/</link><pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.josiete.com/posts/python-explicit-lazy-imports/</guid><description>&lt;p&gt;&lt;img src="https://www.josiete.com/images/python-explicit-lazy-imports.webp" alt="Logo de Python azul y amarillo en relieve sobre una superficie oscura, con bloques desenfocados al fondo"&gt;&lt;/p&gt;&#10;&lt;p&gt;Importar una librería puede implicar leer archivos, ejecutar su código de inicialización y cargar otras dependencias. Ese trabajo se paga aunque después solo queramos mostrar la ayuda de una herramienta. &lt;strong&gt;Python 3.15 incorpora Explicit Lazy Imports&lt;/strong&gt;, definido en el &lt;a href="https://peps.python.org/pep-0810/"&gt;PEP 810&lt;/a&gt; y recogido en las &lt;a href="https://docs.python.org/3.15/whatsnew/3.15.html#pep-810-explicit-lazy-imports"&gt;novedades de Python 3.15&lt;/a&gt;: podemos declarar un import y aplazar su carga hasta el primer uso.&lt;/p&gt;&#10;&lt;h2 id="un-ejemplo-pequeño"&gt;Un ejemplo pequeño&lt;/h2&gt;&#10;&lt;p&gt;Este script requiere Python 3.15 o posterior. Utiliza únicamente la biblioteca estándar:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# herramienta.py&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; argparse&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lazy &lt;span style="color:#f92672"&gt;import&lt;/span&gt; zoneinfo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;parser &lt;span style="color:#f92672"&gt;=&lt;/span&gt; argparse&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ArgumentParser()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_argument(&lt;span style="color:#e6db74"&gt;&amp;#34;--zona&amp;#34;&lt;/span&gt;, help&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Consultar una zona horaria IANA&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;args &lt;span style="color:#f92672"&gt;=&lt;/span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;parse_args()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;zona:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(zoneinfo&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ZoneInfo(args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;zona)) &lt;span style="color:#75715e"&gt;# Aquí se carga zoneinfo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;Sin consulta de zona horaria&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con &lt;code&gt;python herramienta.py --help&lt;/code&gt;, la herramienta termina sin cargar &lt;code&gt;zoneinfo&lt;/code&gt;, siempre que otra dependencia no lo haya importado antes. Con &lt;code&gt;python herramienta.py --zona Europe/Madrid&lt;/code&gt;, el acceso a &lt;code&gt;zoneinfo&lt;/code&gt; provoca su carga; esta consulta requiere que el sistema disponga de datos de zonas horarias o del paquete &lt;code&gt;tzdata&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;También existe &lt;code&gt;lazy from zoneinfo import ZoneInfo&lt;/code&gt;. Se aplaza la carga del módulo completo, no se ejecuta únicamente la clase solicitada. La &lt;a href="https://docs.python.org/3.15/reference/simple_stmts.html#lazy-imports"&gt;referencia del lenguaje&lt;/a&gt; limita esta sintaxis al nivel de módulo: no se permite dentro de funciones, clases o bloques &lt;code&gt;try&lt;/code&gt;, ni con &lt;code&gt;import *&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="dónde-se-ahorra-trabajo"&gt;Dónde se ahorra trabajo&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arranque más rápido:&lt;/strong&gt; se retrasa la inicialización de dependencias hasta que una ruta del programa las necesita.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Menos CPU y lecturas innecesarias:&lt;/strong&gt; una herramienta con una opción de gráficos podría evitar cargar una librería pesada de visualización cuando solo exporta texto.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Menor memoria:&lt;/strong&gt; los módulos que no llegan a cargarse tampoco crean sus objetos ni inicializan sus dependencias exclusivas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;El ahorro depende del programa. Si acabamos utilizando todos los módulos, buena parte del coste simplemente cambia de momento. Conviene comparar procesos nuevos, midiendo el arranque, la primera operación y la memoria con cargas representativas; no hay un porcentaje universal de mejora.&lt;/p&gt;&#10;&lt;h2 id="los-costes-del-aplazamiento"&gt;Los costes del aplazamiento&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;El primer acceso es más lento:&lt;/strong&gt; la primera operación que necesita el módulo asume su importación. En un servicio puede interesar precargarlo antes de atender peticiones para evitar esa latencia inicial.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Los errores aparecen más tarde:&lt;/strong&gt; una dependencia ausente o un fallo de inicialización puede pasar inadvertido hasta que se ejecute esa funcionalidad. Hay que probar también las rutas opcionales y capturar los errores alrededor del uso cuando corresponda. Además, los efectos secundarios del import, como registrar plugins, también se retrasan.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;El tipado estático necesita herramientas compatibles:&lt;/strong&gt; según el PEP, un analizador puede resolver estos nombres como en un import normal; el tipo no se vuelve desconocido por ser lazy. La nueva sintaxis sí exige soporte del analizador y del formateador. También hay que distinguir el análisis estático de la ejecución: un framework que evalúa anotaciones puede provocar la carga del módulo. &lt;code&gt;lazy import&lt;/code&gt; y los imports protegidos con &lt;code&gt;TYPE_CHECKING&lt;/code&gt; tienen comportamientos distintos en tiempo de ejecución.&lt;/p&gt;&#10;&lt;p&gt;Para mantener compatibilidad con versiones anteriores, puede usarse &lt;code&gt;__lazy_modules__ = [&amp;quot;zoneinfo&amp;quot;]&lt;/code&gt; seguido de &lt;code&gt;import zoneinfo&lt;/code&gt;: desde 3.15 será lazy y en versiones anteriores seguirá siendo inmediato. La sintaxis con &lt;code&gt;lazy&lt;/code&gt; produce un error de sintaxis en Python 3.14 y anteriores.&lt;/p&gt;&#10;</description></item></channel></rss>