Mi piacerebbe essere in grado di recuperare in modo dinamico il modulo di esecuzione o il nome della classe corrente da un modulo importato. Ecco il codice:Come posso accedere al modulo di esecuzione o al nome della classe corrente in Python?
foo.py:
def f():
print __name__
bar.py:
from foo import f
def b(): f()
Questo, ovviamente, non funziona come __name__
è il nome del modulo che contiene la funzione. Quello che mi piacerebbe avere accesso all'interno del modulo foo
è il nome del modulo in esecuzione corrente che utilizza foo
. Quindi nel caso sopra sarebbe bar
ma se qualsiasi altro modulo importato foo
mi piacerebbe che foo
abbia accesso dinamico al nome di quel modulo.
Modifica: Il modulo inspect
sembra abbastanza promettente ma non è esattamente quello che stavo cercando. Quello che speravo era una sorta di variabile globale o di livello ambientale a cui potevo accedere che avrebbe contenuto il nome del modulo di esecuzione corrente. Non che io non voglia attraversare lo stack per trovare quell'informazione - ho solo pensato che Python potesse aver già esposto quei dati.
Modifica: Ecco come sto cercando di utilizzare questo. Ho due diverse applicazioni Django che hanno entrambi bisogno di registrare gli errori nel file. Diciamo che sono chiamati "AppOne" e "AppTwo". Ho anche un posto in cui vorrei registrare questi file: "/home/hare/app_logs
". In ogni applicazione in un dato punto mi piacerebbe essere in grado di importare il mio modulo logger e chiamare la funzione di registro che scrive la stringa di registro sul file. Tuttavia, ciò che vorrei fare è creare una directory sotto app_logs
che è il nome dell'applicazione corrente ("AppOne" o "AppTwo") in modo che i file di registro di ogni applicazione andranno nelle rispettive directory di registrazione.
Per fare questo ho pensato che il modo migliore sarebbe stato per il modulo logger di avere accesso a una sorta di variabile globale che denota il nome dell'applicazione corrente in quanto è responsabile della conoscenza della posizione della directory di registrazione principale e creando la directory di registrazione dell'applicazione se non esiste ancora.
Perché si vuole rompere l'attribuzione di responsabilità come questo ? –
Sto usando questo all'interno di un modulo di registrazione - Voglio essere in grado di dire quale modulo esterno sta tentando di accedere senza che il chiamante debba passare una chiave di qualche tipo. –
Stai cercando il modulo che ha avviato l'esecuzione del tuo programma (cioè il cui __name__ == '__main__'? O letteralmente il modulo che ha chiamato foo.f(), che può essere diverso ogni volta che foo.f() è chiamato? –