Учитывая объект кадра, мне нужно получить соответствующий объект модуля. Другими словами, реализуйте 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__ (а также объекты кода), но его нет в кадре. Действительно, не все объекты кода принадлежат функциональным объектам, таким как код для моего теста (с утверждением выше). То же самое можно сказать о объектах frame / code, не имеющих модуля - но многие из них имеют, и в моем случае они будут, так что это не нужно обрабатывать; тем не менее, простое None или исключение в этом случае тоже подойдут.
Такое ощущение, что я упускаю что-то простое. Что нужно сделать, чтобы это работало?