2009-11-04 34 views
111

¿Cómo puedo obtener una referencia a un módulo desde ese módulo? Además, ¿cómo puedo obtener una referencia al paquete que contiene ese módulo?Python: ¿Cómo obtengo una referencia a un módulo dentro del módulo?

+5

que sospechan que podría estar haciendo esta pregunta porque tiene una variable en ** ** ámbito de módulo (por ejemplo, bla = 10 fuera de una función o clase), BLA entonces una variable de clase/función ** ** nombrado, y quieres diferenciar Una pregunta válida aquí es: ¿Es esto necesario ** ** Las reglas de ámbito son notoriamente propensos a error, especialmente por el 'idiota' que recoge el código después (es decir, que, 6 meses después). Trucos como este rara vez son necesarios; Intento evitarlos por completo porque a menudo son confusos y se modifican erróneamente más adelante. –

+1

@ KevinJ.Rice "el 'idiota' que recoge el código después (es decir, que, 6 meses después)" hizo que mi día! – arctelix

+4

¿A quién le importa por qué está haciendo la pregunta? Hay muchas razones válidas para necesitar hacer esto. –

Respuesta

165
import sys 
current_module = sys.modules[__name__] 
+3

excepto por esto no será del todo correcto si el módulo se vuelve a cargar; No creo que haya ningún lugar donde se garantice el mantenimiento de una referencia, si existiera, la recarga no funcionaría realmente, ¿verdad? –

+10

Recargar reutiliza el mismo objeto de módulo; no se crea un nuevo objeto de módulo, por lo que sigue siendo correcto en el momento de volver a cargarlo. – bukzor

14

Si usted tiene una clase en ese módulo, entonces la propiedad __module__ de la clase es el nombre del módulo de la clase. Por lo tanto, puede acceder al módulo a través del sys.modules[klass.__module__]. Esto también funciona para funciones.

+4

En realidad, parece que (al menos) para una función, la propiedad '__module__' no es un módulo, pero una cadena; de este modo un 'inspect.getabsfile (func .__ módulo __)' falla con "_TypeError: 'os' no es un módulo, clase, método, función, rastreo, marco o object_ código"; mientras que 'inspect.getabsfile (sys.modules [o .__ module __])' parece pasar. – sdaau

+0

Gracias, lo arreglaron. – Michael

8

, usted puede obtener el nombre del módulo actual utilizando __name__

La referencia del módulo se pueden encontrar en el diccionario sys.modules.

Véase el pitón documentation

+3

Aprecio el enlace de doc. –

3

Una más técnica, que no importa el módulo sys, y podría decirse - depende de su gusto - más simple:

current_module = __import__(__name__) 

Tenga en cuenta que no hay importación. Python importa cada módulo solo una vez.

+0

Esto parece una muy buena manera de evitar la importación de sys. Aparte de ser un poco contra-intuitivo para leer ¿hay posibles desventajas de este enfoque? – JeremyDouglass

+0

@JeremyDouglass. No que yo supiese. __import__ es una función legítima, documentada e incorporada (la única función __xx__). Puede reemplazarlo con el paquete 'importlib' (tendrá que importarlo). Tal vez - nunca ocurrió a mí - usted podría tener un problema con la importación relativo/absoluto, si un módulo con el mismo nombre está disponible en sys.path, en cuyo caso se puede resolver con el argumento de 'nivel' de la función. – Uri

1

Puede pasar desde el exterior:

mymod.init(mymod) 

No es ideal, pero funciona para mi caso de uso actual.

Cuestiones relacionadas