Supongamos que myapp/foo.py
contiene:
def info(msg):
caller_name = ????
print '[%s] %s' % (caller_name, msg)
Y myapp/bar.py
contiene:
import foo
foo.info('Hello') # => [myapp.bar] Hello
Quiero caller_name
establecer el __name__
atributo del módulo de funciones de llamada (que es 'myapp.foo') en este caso. ¿Cómo se puede hacer esto?
python
stack-trace
introspection
Sridhar Ratnakumar
fuente
fuente
caller_name
no puede ser__main__
Respuestas:
Consulte el módulo de inspección:
inspect.stack()
devolverá la información de la pila.Dentro de una función,
inspect.stack()[1]
devolverá la pila de su llamador. Desde allí, puede obtener más información sobre el nombre de la función, el módulo, etc. de la persona que llama.Consulte los documentos para obtener más detalles:
http://docs.python.org/library/inspect.html
Además, Doug Hellmann tiene una buena descripción del módulo de inspección en su serie PyMOTW:
http://pymotw.com/2/inspect/index.html#module-inspect
EDITAR: Aquí hay un código que hace lo que quieres, creo:
fuente
__name__
atributo de este módulo usando elinspect
módulo? Por ejemplo, ¿cómo vuelvomyapp.foo
(nomyapp/foo.py
) en mi ejemplo anterior? Ya intenté usar el módulo de inspección antes de publicar en SO.inspect.stack()[2]
para la persona que llama real.Frente a un problema similar, descubrí que sys._current_frames () del módulo sys contiene información interesante que puede ayudarlo, sin la necesidad de importar inspeccionar, al menos en casos de uso específicos.
Luego puede "subir" usando f_back:
Para el nombre de archivo, también puede usar f.f_back.f_code.co_filename, como sugirió Mark Roddy anteriormente. No estoy seguro de los límites y advertencias de este método (es muy probable que varios subprocesos sean un problema) pero tengo la intención de usarlo en mi caso.
fuente
sys._getframe(1)
, en lugar de llamarsys._current_frames()
(por cierto, que devuelve un mapeo de marcos para cada hilo).inspect.currentframe()
lugar desys._current_frames().values()[0]
.No recomiendo hacer esto, pero puede lograr su objetivo con el siguiente método:
Luego actualice su método existente de la siguiente manera:
fuente
__name__