Подтвердить что ты не робот

Получение соответствующего модуля из функции

Я хочу изменить модуль 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 находится в другом файле, чем остальные код.

4b9b3361

Ответ 1

Вы хотите получить объект модуля от его имени? Посмотрите его в словаре sys.modules, который содержит все загружаемые модули:

import sys

def modify(func):
    module = sys.modules[func.__module__]

Ответ 2

Используйте модуль проверки:

import inspect

def modify(fun):
    module = inspect.getmodule(fun)

Это то же самое, что и опрос модуля из sys.modules с помощью fun.__module__. Хотя getmodule пытается сложнее, даже если fun не имеет атрибута __module__.

Ответ 3

Вы можете попробовать

modulename = fun.__module__
module = __import__(modulename)

Ответ 4

Вы не хотите этого делать.

  • Это не работает. Представьте, что вы определили функцию в модуле abc, а затем импортировали ее в xyz. test.__module__ будет 'abc' при вызове modify(xyz.test). Тогда вы знали бы изменить abc.test, и вы не закончили бы модификацию xyz.test вообще!

  • Следует избегать патчей обезьян. Обманывать глобальное состояние вашей программы не рекомендуется. Вместо этого, почему вы не можете просто создать новую, модифицированную вещь и использовать ее?