Можно ли получить доступ к атрибуту __name__ из импортированного модуля - PullRequest
3 голосов
/ 25 января 2020

Учитывая модуль A, который импортирует модуль B, есть ли способ для функции в модуле B (используется в модуле A) получить доступ к атрибуту __name__ из модуля A без явной передачи (как, например, , аргумент функции)?

Ответы [ 2 ]

1 голос
/ 25 января 2020

Да, вы можете сделать это, "дойдя до конца" через стек вызовов функций одного уровня, чтобы получить доступ к глобальным переменным вызывающей функции, хранящимся в атрибуте f_globals фрейма. Вот что я имею в виду:

# The main script.

import module_A

module_A.func()

# module_A.py

import module_B

def func():
    module_B.func()

# module_B.py

import sys

def func():
    namespace = sys._getframe(1).f_globals  # caller's globals
    print(f'module_B.func() was called from {namespace["__name__"]}')

Вывод из запуска основного сценария:

module_B.func() was called from module_A

Я хотел бы добавить, что это это довольно хакерская вещь, поэтому вы можете подумать дважды, прежде чем делать это в рабочем коде.

0 голосов
/ 25 января 2020

Если вас вызывают из модуля A, вы можете вернуться к стековому фрейму и получить имя файла с именем функции, из которой вызвана функция модуля B. Ниже приведен пример кода для обхода стека.

import inspect

def recurse(limit):
    local_variable = '.' * limit
    if limit <= 0:
        for frame, filename, line_num, func, source_code, source_index in inspect.stack():
            print '%s[%d]\n  -> %s' % (filename, line_num, source_code[source_index].strip())
            print inspect.getargvalues(frame)
            print
        return
    recurse(limit - 1)
    return

if __name__ == '__main__':
    recurse(3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...