Python не ищет пространство имен местных жителей
Я пытаюсь импортировать функцию из другого модуля; однако я не могу использовать import
потому что имя модуля нужно искать в списке.
Если я попытаюсь вызвать импортированную функцию ExampleFunc
обычно я получаю:
NameError: global name 'ExampleFunc' is not defined
Тем не мение; если я явно скажу python искать в локальных файлах, он найдет его.
Файл module.py
def ExampleFunc(x):
print x
Файл code.py
def imprt_frm(num,nam,scope):
for key, value in __import__(num,scope).__dict__.items():
if key==nam:
scope[key]=value
def imprt_nam(nam,scope):
imprt_frm("module",nam,scope)
def MainFunc(ary):
imprt_nam("ExampleFunc",locals())
#return ExampleFunc(ary) #fails
return locals()["ExampleFunc"](ary) #works
MainFunc("some input")
1 ответ
locals()
словарь является лишь отражением фактического массива местных жителей. Вы не можете добавлять новые имена местным жителям через него, а также не можете изменять существующих местных жителей.
Это словарь, созданный по запросу из фактических локальных кадров, и только односторонний. От locals()
функциональная документация:
Примечание: содержание этого словаря не должно быть изменено; изменения могут не повлиять на значения локальных и свободных переменных, используемых интерпретатором.
Локалы функций высоко оптимизированы и определены во время компиляции, Python основывается на том, что не может динамически изменять известные локальные объекты во время выполнения.
Вместо того, чтобы пытаться вставлять данные в локальные объекты напрямую, вы можете вернуть один объект из динамического импорта. Использовать importlib
модуль, а не __import__
Вот:
import importlib
def import_frm(module_name, name):
module = importlib.import_module(module_name)
return getattr(module, name)
затем просто назначьте местное имя:
def MainFunc(ary):
ExampleFunc = import_from('module' , 'ExampleFunc')
ExampleFunc(ary)