2012-07-28 24 views
18

Para los mensajes de depuración detallada en mi aplicación, estoy usando una función que devuelve un prefijo útil. Consideremos el siguiente ejemplo:Python: obtenga el nombre completo del módulo del paquete

import inspect 

def get_verbose_prefix(): 
    """Returns an informative prefix for verbose debug output messages""" 
    s = inspect.stack() 
    module_name = inspect.getmodulename(s[1][1]) 
    func_name = s[1][3] 

    return '%s->%s' % (module_name, func_name) 

def awesome_function_name(): 
    print "%s: Doing some awesome stuff right here" % get_verbose_prefix() 

if __name__ == '__main__': 
    awesome_function_name() 

Este salidas:

test->awesome_function_name: Doing some awesome stuff right here

Mi problema es: Cuando tengo un módulo en un paquete, por ejemplo 'myproject.utilities.input', el nombre del módulo devuelto desde get_verbose_prefix sigue siendo solo 'entrada', no 'myproject.utilities.input'. Esto reduce drásticamente la utilidad del prefijo en proyectos grandes cuando puede haber varios módulos de "entrada" en diferentes submódulos, todos trabajando juntos.

Así que mi pregunta es: ¿Hay una manera simple de recuperar el nombre completo del módulo dentro de su paquete en Python? Estoy planeando expandir la función get_verbose_prefix para buscar archivos '__init__.py' en los directorios principales del módulo para extrapolar su nombre completo, pero primero me gustaría saber si hay una manera más fácil de hacerlo.

Respuesta

27

__name__ siempre contiene el nombre completo del módulo. (Aparte de __main__ en la principal, por supuesto.)

+1

supongo que eso es cierto, pero ¿cómo consigo al módulo real de la contexto de mi función de prefijo? – Hubro

+8

No importa, me di cuenta de eso: 'inspeccionar.getmodule (s [1] [0]) .__ name__'. También debe editar en que '__name__' en realidad no siempre devuelve el nombre completo del módulo, ya que devuelve' __main__' en el módulo ejecutado – Hubro

+0

¿Qué es 's' en' inspeccionar.getmodule (s [1] [0]) .__ nombre__'? –

6

Intente utilizar el atributo __name__ del módulo.

2

Una forma sencilla de recuperar el nombre del módulo completo dentro de su paquete:

print(__file__) 
Cuestiones relacionadas