Я пытаюсь определить фактический текущий модуль функции (как видно, если он импортирован из другого места), даже если текущий модуль является " средой сценариев верхнего уровня. ] " __main__
.
Это может показаться странным, но суть в том, что мне нужно сериализовать функцию и десериализовать ее (включая аргументы) на другой машине, для которой мне нужно убедиться, что модуль правильный, А НЕ __main__
импортируется перед десериализацией (в противном случае я получаю сообщение об ошибке AttributeError: объект 'module' не имеет атрибута my_fun
).
До сих пор я пробовал инспекцию:
import inspect
print inspect.getmodule(my_fun)
, что дает мне
, конечно. Я также пытался найти что-то полезное, используя globals()
, но безуспешно.
Что мне действительно нужно, так это
. Я полагаю, что хакерским способом было бы проанализировать его по имени файла, используя что-то вроде
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
, а затем найти модуль по имени sys.modules[m_name]
.
Есть ли более чистый/лучший способ сделать это?
РЕДАКТИРОВАТЬ:
Узнав о «FakeModule» ipython и немного погуглив, я наткнулся на этот пост, в котором точно описывается проблема, с которой я столкнулся, включая мое текущее решение (которое явно импортирует текущий модуль импортировать current_module
и сериализовать current_module.my_fun
вместо my_fun). Я пытаюсь этого избежать, так как это может быть не интуитивно понятным для пользователей моего пакета.