Utilizar Python es sinónimo de aprovechar sus librerías: nos proporcionan acceso a códigos más complejos que nos ahorran mucho trabajo de desarrollo, y además son sencillas de instalar e importar para utilizarlas en nuestros proyectos. Sin embargo, hay distintas formas en las que podemos importar librerías en Python, y debemos tener muy en claro qué forma elegimos y por qué, si queremos evitar errores.
Utilicemos por ejemplo la librería os (una librería muy popular que nos permite interactuar con directorios y archivos del sistema, aunque no es el foco ahora mismo), y analicemos la importación de la librería y sus métodos a través de las diferentes alternativas que existen para hacerlo, explorando sus ventajas, desventajas, y consecuencias para nuestro código.
Supongamos que, en última instancia, necesitamos acceder a la función system de la librería os, y también a la función incorporada open() (que no pertenece a os, sino que forma parte del lenguaje, pero que también existe en la librería os con algunas diferencias). Para importar la librería, tendríamos tres opciones (con dos de ellas, muy similares entre sí):
- import os
- from os import *
- from os import system
La primera y la segunda opción importarán la librería completa (con una importante diferencia, que ya veremos), mientras que la última importará únicamente el método system de la librería.
Debemos saber que la segunda forma tiene riesgos, ya que no solo lograremos acceso a la librería os, sino que lo haremos reemplazando todo el espacio de nombres de nuestro código con el espacio de nombres de la librería os. En particular, esto ocasiona que se sobrescriba la función incorporada open() (la cual, al venir incorporada al lenguaje, no tiene necesidad de importar librería alguna para funcionar), por el método open() de la librería os, el cual tiene diferentes parámetros, tal como podemos verificar en la documentación (Método open() de la librería os, Método open() incorporado). Cuando importamos una librería mediante:
import os
accedemos a los métodos de dicha librería en nuestro propio código anteponiendo el nombre de la librería (por ejemplo os.system('cls')), pero cuando lo importamos "completo":
form os import *
los métodos de dicha librería ocupan ahora nuestro espacio de nombres, por lo cual ya no necesitamos anteponer el nombre de la librería (permitiéndonos escribir directamente system('cls')). Como riesgo asociado, ahora no podemos diferenciar el método open() de la librería importada del que existe por defecto en Python, siendo de hecho reemplazado, generando errores si esto no formaba parte de nuestros planes.
En síntesis: si necesitamos acceder a varias funciones o clases de una misma librería, una buena solución es importarla de la primera forma:
import os
e importar, en caso de ser necesario, métodos específicos de dicha librería de manera explícita (para poder utilizarlos varias veces, sin necesidad de anteponer el nombre de la librería a la que pertenece), solo en los casos donde no exista riesgo de sobreescribir otros métodos que necesitamos.
from os import system
Por lo que vemos aquí que la primera y tercera alternativa pueden coexistir en el código, siendo de hecho complementarias.