2015-08-11 3 views
0

Код происхождения (упростить, например):питона динамического из функции импорта модуля строки

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
from utils.func_a import func_a as _func_a 
from utils.func_b import func_b as _func_b 
def func_a(): 
    _func_a() 

def func_b(): 
    _func_b() 

if __name__ == '__main__': 
    func_a() 

теперь я только называюсь func_a, или, может быть func_b, это зависит от конфигурации.

поэтому я хочу сделать из динамического ... импорт ..., такие как:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
def func_a(): 
    _func_a() 

def func_b(): 
    _func_b() 

if __name__ == '__main__': 
    keys = ['func_a'] 
    for k in keys: 
     mod_n = func_n = k 
     from utils.<mod_n> import <func_n> as _<func_n> # TODO 
    func_a() 

, но я не знаю, как это осуществить?

То, что я думал, что это сделать импорт в func_X():

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
def func_a(): 
    from utils.func_a import func_a as _func_a 
    _func_a() 

def func_b(): 
    from utils.func_b import func_b as _func_b 
    _func_b() 

if __name__ == '__main__': 
    func_a() 

, но этот путь будет делать импорт каждый раз, когда вызов функции.


Дополнение:

Я попытался __import__/importlib, но не может реализовать это условие

+2

Что касается последнего примера: импорт кэшируются, поэтому модули вы упоминаете, не будут импортированы при каждом вызове функции. [Подробнее читайте здесь.] (Https://docs.python.org/3/reference/import.html) –

+0

Взгляните на [importlib] (https://docs.python.org/3/library/importlib .html # module-importlib). –

ответ

2

__import__ является встроенной функцией, которая принимает имя модуля в виде строки и возвращает модуль в качестве объект. См the documentation:

__import__(name[, globals[, locals[, fromlist[, level]]]]) 

Функция импортирует модуль name, потенциально используя данную globals и locals, чтобы определить, как интерпретировать имя в контексте пакета. fromlist дает имена объектов или подмодулей, которые должны быть импортированы из модуля, заданного name.

+0

Я пробовал '__import__' /' importlib', но не могу внедрить этот –

+0

Можете ли вы объяснить, почему вы не можете его реализовать? –

+0

получить модуль __import__ и получить func getattr, но func - это переменная. Он не может внедрить второй пример –

0

, прежде чем я задаю вопрос, я попытался __import__ и importlib, но не может выписать код.

спасибо за @ машинное стремление, я прочитал весь документ __import__.

это мое решение:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import sys 
def func_a(): 
    _func_a() 

def func_b(): 
    _func_b() 

if __name__ == '__main__': 
    keys = ['func_a'] 
    for k in keys: 
     mod_n = func_n = k 
     _temp = __import__('utils.'+mod_n, fromlist=[func_n]) 
     _func = getattr(_temp, func_n) 
     new_func_n = '_{0}'.format(k) 
     setattr(sys.modules[__name__], new_func_n, _func) 

    func_a() 
Смежные вопросы