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)
Другие вопросы по тегам