Sto provando a determinare il modulo corrente attuale di una funzione (come visto se importato da altrove), anche se il modulo corrente è "top level scripting environment" __main__
.Python: determina il modulo corrente attuale (non __main__)
Può sembrare una cosa strana da fare, ma lo sfondo è che ho bisogno di serializzare una funzione e di non serializzarla (inclusi argomenti) su una macchina diversa, per la quale ho bisogno di assicurarmi il modulo corretto E NON __main__
viene importato prima della deserializzazione (altrimenti viene visualizzato un errore che indica AttributeError: 'module' object has no attribute my_fun
).
Finora, ho provato inspection:
import inspect
print inspect.getmodule(my_fun)
che mi dà
<module '__main__' from 'example.py'>
naturalmente. Ho anche provato a trovare qualcosa di utile usando globals()
, senza fortuna.
Quello che voglio veramente è <module 'example' from 'example.py'>
. Suppongo che un modo hacky sarebbe quello di analizzarlo dal nome del file utilizzando qualcosa come
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
e poi trovare il modulo in base al nome sys.modules[m_name]
.
Esiste un metodo più pulito/migliore per farlo?
EDIT: Dopo aver appreso "FakeModule" di ipython e un po 'più googling, mi sono imbattuto this post, che descrive esattamente il problema che sto affrontando, compresa la mia soluzione attuale ad essa (che sta importando esplicitamente il modulo corrente import current_module
e serializzazione current_module.my_fun
anziché my_fun). Sto cercando di evitare questo, in quanto potrebbe non essere intuitivo per gli utenti del mio pacchetto.
Avete già esaminato l'interno della libreria 'nose', in particolare il modulo 'importatore'? Il "naso" ha qualcosa di molto simile a questo, quindi potrebbe essere un buon posto per cercare l'ispirazione. –