¿Cuáles son todas las formas de importar módulos en Python?

He investigado un poco y encontré el siguiente artículo: http://effbot.org/zone/import-confusion.htm . Si bien esto parece ser una gran guía, fue escrito en 1999, hace un tiempo. Estoy usando Python 3.4.3, entonces estoy pensando que algunas cosas han cambiado, lo que me preocupa, porque no quiero aprender lo que no es aplicable. Por lo tanto, en Python 3, ¿cuáles son todas las formas de importar paquetes y módulos, en detalle? ¿Cuáles son las formas más comunes y deben usarse sobre otras?

Las únicas formas que importan para el uso ordinario son las tres primeras formas enumeradas en esa página:

  • import module
  • from module import this, that, tother
  • from module import *

Estos no han cambiado en Python 3. (Se han modificado algunos de los detalles sobre dónde busca Python el archivo module.py para cargar el module , pero el comportamiento de la importación en sí sigue funcionando como se describe en la página que has vinculado).

Se ha agregado una cosa, antes de Python 3, pero desde ese artículo. Eso es explícito de las importaciones relativas. Estos te permiten hacer cosas como from ..module import blah . Este tipo de importación solo se puede utilizar desde un paquete; permite que los módulos en un paquete se refieran a otros módulos en el mismo paquete de una manera que sea relativa al paquete (es decir, sin tener que especificar cómo importar el paquete de nivel superior). Puedes leer los detalles en PEP 328 . Sin embargo, incluso esto es básicamente una nueva variación en la syntax del estilo de from module import blah menciona en la página a la que se vinculó.

__import__ también funciona en Python 3. Esta es una función interna que solo necesitarías usar si haces algo bastante inusual. Lo mismo se aplica a varias funciones en el módulo importlib (y el módulo imp desuso). El nivel exacto de magia de estas funciones de importación varía de una a otra, pero para el uso normal de “solo quiero importar este módulo y usarlo”, en realidad nunca necesita usarlos. Solo son necesarios si desea hacer algo como importar dinámicamente un módulo cuyo nombre no se conoce hasta el tiempo de ejecución.

El Zen de Python te da algunos consejos:

 >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those! 

Por lo tanto, dado que el método simple y obvio es: import nombre_módulo y conserva los espacios de nombres, sugeriría que si bien hay varios métodos de importación como se puede ver en la entrada del manual de python3 y se pueden extender al anular el __import__() o al enrollar propio, diría que mantente en ello hasta que tengas una buena razón para no hacerlo .

El hecho de que __import__() esté rodeado de guiones bajos también es un indicio de dejarlo solo.

Si desea comprender las decisiones de diseño detrás de los mecanismos de importación, comience con el manual y luego continúe con los PEP 302 y 420 que son buenos puntos de partida.

Podemos importar módulos en Python usando las siguientes formas

  • import module
  • from module import function
  • from module import *

Aunque usar from module import * no es una buena práctica, debido a la legibilidad: otro progtwigdor no puede entender qué se usa realmente en el módulo actual. Sobrecarga de memoria: Todos se cargan en la memoria. Mejores prácticas para utilizar la importación en un módulo.

Creo que importar como tupla sería mucho mejor para la legibilidad y la longitud máxima de línea (pep8)

La statement de importación tiene dos problemas :

  • Las declaraciones de importación largas pueden ser difíciles de escribir, y requieren varias contorsiones para ajustarse a las pautas de estilo Pythonic.
  • Las importaciones pueden ser ambiguas frente a los paquetes; dentro de un paquete, no está claro si la import foo refiere a un módulo dentro del paquete o algún módulo fuera del paquete.
  • golang lenguaje golang tiene lo mismo para eso

así que más preferiría importar un poco esto

 from package import (x, y) 

en lugar de esto

 from authentication.views import SignupView, LoginView, VerificationView, SignupDetailView 

https://legacy.python.org/dev/peps/pep-0328/