Come ottenere un riferimento a un modulo all'interno del modulo stesso?


159

Come posso ottenere un riferimento a un modulo all'interno di quel modulo? Inoltre, come posso ottenere un riferimento al pacchetto contenente quel modulo?


7
Ho il sospetto che potresti farti questa domanda perché hai una variabile nell'ambito del modulo (ad esempio, BLAH = 10 al di fuori di una funzione o classe), quindi una variabile di classe / funzione denominata BLAH e vuoi differenziarti. Una domanda valida qui è: è necessario? Le regole dell'ambito sono notoriamente soggette a errori, in particolare da parte dell '"idiota" che raccoglie il codice dopo di te (cioè sei mesi dopo). Trucchi come questo sono raramente necessari; Cerco di evitarli completamente perché sono così spesso confusi e erroneamente modificati in seguito.
Kevin J. Rice,

2
@ KevinJ.Rice "l '" idiota "che prende il tuo codice dopo di te (cioè sei mesi dopo)" mi ha reso felice!
arctelix,

8
A chi importa perché sta ponendo la domanda? Ci sono molte ragioni valide per farlo.
Christopher Barber,

Deve essere chiuso. Troppo utile.
mlvljr

Risposte:


212
import sys
current_module = sys.modules[__name__]

3
se non per questo non sarà del tutto corretto se il modulo viene ricaricato; Non credo che ci sia un posto in cui è garantito il mantenimento di un riferimento, se ci fosse, la ricarica non funzionerebbe davvero, giusto?
Dima Tisnek,

14
Il ricaricamento riutilizza lo stesso oggetto modulo; non viene creato alcun nuovo oggetto modulo, quindi è ancora corretto di fronte al nuovo caricamento.
bukzor,

18

Un'altra tecnica, che non importa il modulo sys, e probabilmente - dipende dai tuoi gusti - più semplice:

current_module = __import__(__name__)

Ricorda che non esiste importazione. Python importa ogni modulo una sola volta.


Questo sembra un modo davvero carino per evitare di importare sys. Oltre ad essere un po 'controintuitivo da leggere, ci sono potenziali svantaggi di questo approccio?
JeremyDouglass,

@JeremyDouglass. Non che ne sia consapevole. import è una funzione incorporata, documentata e legittima (l'unica funzione xx ). Puoi sostituirlo con il pacchetto 'importlib' (dovrai importarlo). Forse - non mi è mai successo - potresti avere un problema con l'importazione relativa / assoluta, se un modulo con lo stesso nome è disponibile in sys.path, nel qual caso puoi risolverlo con l'argomento 'level' della funzione.
Uri,

16

Se hai una classe in quel modulo, la __module__proprietà della classe è il nome del modulo della classe. In questo modo è possibile accedere al modulo tramite sys.modules[klass.__module__]. Questo funziona anche per le funzioni.


4
In realtà, sembra che (almeno) per una funzione, la __module__proprietà non sia un modulo, ma una stringa; quindi un inspect.getabsfile(func.__module__)errore con " TypeError: 'os' non è un oggetto modulo, classe, metodo, funzione, traceback, frame o codice "; mentre inspect.getabsfile(sys.modules[o.__module__])sembra passare.
sdaau,

12

Puoi ottenere il nome del modulo corrente usando __name__

Il riferimento del modulo può essere trovato nel sys.modulesdizionario.

Vedi la documentazione di Python


1

Puoi passarlo dall'esterno:

mymod.init(mymod)

Non ideale ma funziona per il mio caso d'uso attuale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.