Я знаю, что это не звучит Pythonic, но медведь со мной на секунду.Как я могу выяснить в своем модуле, если основная программа использует определенную переменную?
Я пишу модуль, который зависит от какого-либо внешнего модуля с закрытым кодом. Этот модуль должен получить экземпляр для использования (используя module.create()).
Мой модуль пытается выяснить, действительно ли мой пользователь уже загрузил этот модуль (легко сделать), но затем необходимо выяснить, был ли экземпляр модуля. Я понимаю, что проверка типа() каждой переменной может мне это сказать, но я не уверен, как я могу получить имена переменных, определенных основной программой. Причина этого заключается в том, что при создании экземпляра модели они также устанавливают набор параметров, которые я не хочу переписывать по какой-либо причине.
Мои попытки до сих пор были связаны с использованием sys._getframe(). F_globals и итерацией по элементам, но в моем тестировании это не работает. Если я создам экземпляр модуля как modInst, а затем вызову функцию в моем модуле, он не сможет показать переменную modInst. Есть ли другое решение? Пример кода приведен ниже.
import sys
if moduleName not in sys.modules:
import moduleName
modInst = moduleName.create()
else:
globalVars = sys._getframe().f_globals
for key, value in globalVars:
if value == "Module Name Instance":
return key
return moduleName.create()
EDIT: пример кода.
Alex, спасибо. Sys.modules ['__ main__'] намного более элегантны, чем sys._getframe (1) .f_globals. Конечно, они оба предполагают, что основная программа - это функция, называемая функцией create, а не один из их собственных модулей, но я не уверен, что это легко решить (если только я не пересекаю все sys.modules). Что касается функции .create(), создающей любые переменные - это не так. Все переменные хранятся в объекте create(), создающем для вас, и ничего не хранится снаружи. Вот почему у меня так много проблем с этим. Есть ли способ найти объект независимо от модуля? –
@ Michalis, вообще говоря, нет, нет общего способа найти объект, не имея представления о том, где он может быть сохранен. Однако вы можете попробовать http://docs.python.org/library/gc.html?highlight=gc#gc.get_objects - он вернет вам все списки и dicts (и некоторые другие контейнеры) для вас. Разумеется, для большой программы эта проверка может занять довольно много времени! –