Извлечение объекта модуля из кадра стека

Учитывая объект фрейма, мне нужно получить соответствующий объект модуля. Другими словами, реализуйте 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, не имеющих модуля, но многие из них делают это, и в моем случае они будут, так что это не нужно обрабатывать; однако в этом случае просто нет или исключение.

Мне кажется, что я пропустил что-то простое. Что нужно сделать для этого?

  • Как создать файл яйца Python
  • Итерация над 2d-массивом в расширяющейся круговой спирали
  • Flask-SQLalchemy обновляет информацию о строке
  • Есть ли эквивалент python инструментария визуализации предзапусков?
  • Python - Предыдущие и следующие значения внутри цикла
  • Отпустите порт Python Flask, когда скрипт завершен
  • Поиск полного пути в трассировке Python
  • ImportError: невозможно импортировать имя
  • 2 Solutions collect form web for “Извлечение объекта модуля из кадра стека”

     import inspect def callers_module(): module = inspect.getmodule(inspect.currentframe().f_back) return module 

    Хотя inspect.getmodule отлично работает, и я действительно искал не то место, чтобы найти его, я нашел немного лучшее решение для меня:

     def callers_module(): module_name = inspect.currentframe().f_back.f_globals["__name__"] return sys.modules[module_name] 

    Он по-прежнему использует index.currentframe (который я предпочитаю с точно идентичным sys._getframe), но не вызывает отображение имени модуля module-filename (в inspect.getmodule).

    Кроме того, этот вопрос вдохновил интересный способ управления __all__ :

     from export import export @export class Example: pass @export def example: pass answer = 42 export.name("answer") assert __all__ == ["Example", "example", "answer"] 
    Python - лучший язык программирования в мире.