Ответ 1
Вы хотите получить объект модуля от его имени? Посмотрите его в словаре sys.modules
, который содержит все загружаемые модули:
import sys
def modify(func):
module = sys.modules[func.__module__]
Я хочу изменить модуль xyz и его функции следующим образом:
def modify(fun):
modulename = fun.__module__ # this is string. ok, but not enough
import xyz
modify(xzy.test)
Моя проблема заключается в доступе к пространству имен xzy
внутри modify
. Иногда
globals()[fun.__module__]
работает. Но тогда я получаю проблемы, если определение modify
находится в другом файле, чем остальные
код.
Вы хотите получить объект модуля от его имени? Посмотрите его в словаре sys.modules
, который содержит все загружаемые модули:
import sys
def modify(func):
module = sys.modules[func.__module__]
Используйте модуль проверки:
import inspect
def modify(fun):
module = inspect.getmodule(fun)
Это то же самое, что и опрос модуля из sys.modules
с помощью fun.__module__
. Хотя getmodule
пытается сложнее, даже если fun
не имеет атрибута __module__
.
Вы можете попробовать
modulename = fun.__module__
module = __import__(modulename)
Вы не хотите этого делать.
Это не работает. Представьте, что вы определили функцию в модуле abc
, а затем импортировали ее в xyz
. test.__module__
будет 'abc'
при вызове modify(xyz.test)
. Тогда вы знали бы изменить abc.test
, и вы не закончили бы модификацию xyz.test
вообще!
Следует избегать патчей обезьян. Обманывать глобальное состояние вашей программы не рекомендуется. Вместо этого, почему вы не можете просто создать новую, модифицированную вещь и использовать ее?