En Python, la palabra clave from se utiliza principalmente para importar módulos y sus componentes específicos de manera que puedas usarlos directamente en tu código.
Esta palabra clave se emplea generalmente en combinación con import y permite acceder solo a objetos específicos de un módulo sin cargar todo el contenido del módulo.
Además, from tiene otros usos en Python:
- Con
raise: Encadena excepciones y preserva el contexto del error original. - Con
yield: Delega la iteración a otro generador o iterable.
Sintaxis
La sintaxis básica para utilizar from junto con import es la siguiente:
from module_name import specific_component
Si necesitas crear un alias para evitar conflictos de nombres o simplificar el uso, puedes usar as:
from module_name import specific_component as alias
También puedes importar múltiples componentes separados por comas:
from module_name import component1, component2
Además, puedes usar * para importar todos los componentes del módulo:
from module_name import *
Esta sintaxis se conoce como wildcard import y es común en secciones de trabajo interactivas. Sin embargo, no se recomienda usarla en código en producción pues puede causar conflictos de nombres y dificultar la depuración.
Sintaxis para el uso con raise:
raise NewException("mensaje") from original_exception
Si deseas suprimir el contexto de la excepción original, puedes usar None:
raise NewException("mensaje") from None
Sintaxis para el uso con yield:
yield from iterable
Esta sintaxis equivale a iterar sobre el iterable y producir cada elemento uno por uno.
Ejemplos prácticos
Aquí hay algunos ejemplos que ilustran cómo se usa la palabra clave from:
>>> from math import pi
>>> pi
3.141592653589793
En este ejemplo, solo se importa pi del módulo math, permitiéndote usarlo directamente sin tener que prefijarlo con math.
>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> future = now + timedelta(days=5)
>>> future
datetime.datetime(2023, 10, 27, 15, 34, 50, 401213)
En este ejemplo, se importan datetime y timedelta del módulo datetime. Esto permite trabajar con fechas y tiempos de manera más directa.
A continuación, un ejemplo de encadenamiento de excepciones con raise from:
>>> def connect_to_database(connection_string):
... try:
... # Código de conexión
... raise ConnectionError("no se pudo conectar al servidor")
... except ConnectionError as error:
... raise RuntimeError("error en la base de datos") from error
...
>>> connect_to_database("localhost:5432")
Traceback (most recent call last):
...
ConnectionError: no se pudo conectar al servidor
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
...
RuntimeError: error en la base de datos
En este ejemplo, se preserva la excepción original (ConnectionError) como causa directa del nuevo error (RuntimeError).
Finalmente, un ejemplo de delegación de iteración con yield from:
>>> def combine(first, second):
... yield from first
... yield from second
...
>>> list(combine([1, 2], [3, 4]))
[1, 2, 3, 4]
En este ejemplo, yield from delega la iteración a cada lista, produciendo sus elementos sin necesidad de un bucle explícito.
Uso de from
Los casos de uso más comunes de la palabra clave from incluyen los siguientes:
- Importar componentes específicos de un módulo para mantener el namespace limpio y mejorar la legibilidad.
- Evitar conflictos de nombres al importar solo lo necesario.
- Hacer el código más limpio y fácil de entender al eliminar la necesidad de prefijos de módulo para componentes importados.
- Permitir la importación de múltiples componentes de un módulo en una sola línea.
- Encadenar excepciones con
raise ... from ...para preservar el contexto del error original. - Delegar la iteración a otro generador o iterable con
yield from.
Resumiendo
La palabra clave from en Python es una herramienta versátil con múltiples usos: importar componentes específicos de módulos, encadenar excepciones con raise y delegar iteraciones con yield.
Dominar estos usos te permite escribir código más claro, modular y expresivo en diferentes contextos de programación.