Учитывая объект кадра, мне нужно получить соответствующий объект модуля. Другими словами, реализуйте callers_module, чтобы это работало:
import sys
from some_other_module import callers_module
assert sys.modules[__name__] is callers_module()
(Это было бы эквивалентно, потому что я могу сгенерировать трассировку стека в функции для этого тестового примера. Импорт нужен просто для того, чтобы сделать этот пример полным и тестируемым, и чтобы callers_module не использовал ярлык с использованием __name__, поскольку он находится в другом модуле .)
Я пробовал это:
import inspect
def callers_module():
return inspect.currentframe().f_back
Которая получает объект кадра, на котором f_code даст мне объект кода, но я не могу понять, как получить соответствующий модуль или его имя (для использования с sys.modules). Если бы я мог получить объекты функций, они имели бы атрибут __module__ (а также объекты кода), но не присутствовали бы во фрейме. В самом деле, не все объекты кода принадлежат объектам функций, таким как код для моего тестового примера (с assert, приведенным выше). То же самое можно сказать и об объектах фрейма / кода, не имеющих модуля, но многие из них имеют, а в моем случае они будут, так что это не нужно обрабатывать; однако и в этом случае подойдет простое None или исключение.
Такое чувство, что я упускаю что-то простое. Что нужно сделать, чтобы это сработало?