2012-07-28 17 views
18

Dla szczegółowych komunikatów debugowania w mojej aplikacji używam funkcji, która zwraca pomocny prefiks. Rozważmy następujący przykład:Python - pobierz pełną nazwę modułu pakietu

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() 

This Wyjścia:

test->awesome_function_name: Doing some awesome stuff right here

Mój problem jest: Kiedy mam moduł w opakowaniu, na przykład 'myproject.utilities.input', nazwa modułu zwrócona z get_verbose_prefix nadal jest po prostu "input", a nie "myproject.utilities.input". To drastycznie zmniejsza przydatność prefiksu w dużych projektach, gdy może istnieć kilka modułów "wejściowych" w różnych podmodułach, które współpracują ze sobą.

Moje pytanie brzmi: Czy istnieje prosty sposób pobrania pełnej nazwy modułu w jego pakiecie w Pythonie? Planuję rozszerzenie funkcji get_verbose_prefix, aby sprawdzić pliki "__init__.py" w katalogach nadrzędnych modułu w celu ekstrapolacji jego pełnej nazwy, ale najpierw chciałbym się dowiedzieć, czy jest łatwiejszy sposób na to.

Odpowiedz

27

__name__ zawsze zawiera pełną nazwę modułu. (Inne niż __main__ na główną, oczywiście.)

+1

Przypuszczam, że to prawda, ale w jaki sposób dostać się do rzeczywistej modułu od kontekst mojej funkcji prefiksu? – Hubro

+8

Nieważne, wymyśliłem to: 'inspect.getmodule (s [1] [0]) .__ name__'. Powinieneś również edytować, że '__name__' nie zwraca zawsze pełnej nazwy modułu, ponieważ zwraca' __main__' na uruchomionym module – Hubro

+0

Co to jest 's' w' inspect.getmodule (s [1] [0]) .__ name__'? –

6

Spróbuj użyć atrybutu __name__ modułu.

2

Prostym sposobem pobierania pełną nazwę modułu wewnątrz opakowania:

print(__file__)