¿Ejecuta “from-import” todo el módulo?

Bien, entonces sé que from-import es “exactamente” lo mismo que import , excepto que obviamente no es porque los espacios de nombres se llenan de manera diferente.

Mi pregunta está motivada principalmente porque tengo un módulo de utils que tiene una o dos funciones que se utilizan en todos los demás módulos de mi aplicación, y estoy trabajando en la incorporación del módulo de logging biblioteca estándar, que por lo que puedo decir que necesito hacer algo así como esto:

 import logging logging.basicConfig(filename="/var/log") # I want file logging baselogger = logging.getLogger("mine") #do some customizations to baselogger 

y luego, para usarlo en un módulo diferente, volvería a importar el registro:

 import logging logger = logging.getlogger("mine") # log stuff 

Pero lo que quiero saber es si hago from utils import awesome_func ¿se configurará definitivamente mi registrador y se configurará el módulo de registro de la forma que quiero?

Esto se aplicaría a otras configuraciones genéricas también.

Parece que la respuesta es sí:

 $ echo 'print "test" def f1(): print "f1" def f2(): print "f2" ' > util.py $ echo 'from util import f1 f1() from util import f2 f2() ' > test.py $ python test.py test f1 f2 $ 

La respuesta a tu pregunta es sí.

Para obtener una buena explicación del proceso de importación, consulte ” Importación de módulos de Python ” de Frederik Lundh.

En particular, citaré las secciones que responden a su consulta.

¿Qué hace Python para importar un módulo?

[…]

  1. Crear un nuevo objeto de módulo vacío (esto es esencialmente un diccionario)
  2. Inserte ese objeto de módulo en el diccionario sys.modules
  3. Cargue el objeto de código del módulo (si es necesario, compile el módulo primero)
  4. Ejecute el objeto de código de módulo en el espacio de nombres del nuevo módulo. Todas las variables asignadas por el código estarán disponibles a través del objeto de módulo.

y en el uso de from-import :

Hay muchas formas de importar un módulo

[…]

desde X importar a, b, c importa el módulo X y crea referencias en el espacio de nombres actual a los objetos dados. O en otras palabras, ahora puede usar a y b y c en su progtwig.

Tenga en cuenta que he elidido algunos asuntos. Vale la pena leer todo el documento, en realidad es bastante corto.

Sí, from MODULE import OBJECT ejecuta todo en el módulo y luego realiza OBJECT = MODULE.OBJECT . Se puede decir que el módulo ya se ha cargado, en cierto sentido, porque ahora reside en el diccionario sys.modules .

Como se mencionó anteriormente, sí. Y puedes escribir una prueba simple para estar seguro:

 # file m.py import sys # define function def f(): pass #execute this when module is loaded (ie imported or run as script) print 'imported', __name__ # print all "exposed" variables to make sure that the f is visible print dir(sys.modules[__name__]) # file main.py from m import f print 'done' 

Recomiendo escribir tales pruebas cada vez que tenga dudas sobre cómo funciona la importación o la creación de subclases o cualquier otra cosa.