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.
Przypuszczam, że to prawda, ale w jaki sposób dostać się do rzeczywistej modułu od kontekst mojej funkcji prefiksu? – Hubro
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
Co to jest 's' w' inspect.getmodule (s [1] [0]) .__ name__'? –