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?
[…]
- Crear un nuevo objeto de módulo vacío (esto es esencialmente un diccionario)
- Inserte ese objeto de módulo en el diccionario sys.modules
- Cargue el objeto de código del módulo (si es necesario, compile el módulo primero)
- 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.