为给定参数的函数导入不同的模块

时间:2018-02-07 17:24:04

标签: python python-3.x design-patterns

假设我有两个文件。在第一个文件中,main函数接受输入usr_input,然后在第二个文件中调用函数myfun。第二个文件中的函数根据usr_input导入模块并调用其方法。 (当然导入的类具有相同的接口)

目前我将usr_input作为参数传递并使用importlib,如简化代码所示:

# A.py
class A:
    def foo(self):
        print('This is class A')

# B.py
class B:
    def foo(self):
        print('This is class B')

# main.py
from test_module.fun import *
if __name__ == '__main__':
    usr_input = 'A' # or 'B'
    myfun(usr_input)

# fun.py
import importlib
def myfun(module_name):
    mn = importlib.import_module('test_module.'+module_name)
    mnc = getattr(mn, module_name)
    mnc().foo()

然而在函数中导入模块导致了问题并且必须更换(在调用函数之前应该导入模块,通常在文件的开头导入)。我该如何改变设计(而不是导入所有可能的类:A,B ......)?

PS:从保存的外部文件中读取模块名称不起作用,因为myfun在其值已知之前已初始化。

2 个答案:

答案 0 :(得分:0)

模块的动态加载:

>>> moduleNames = ['sys', 'os', 're', 'unittest'] 
>>> moduleNames
['sys', 'os', 're', 'unittest']
>>> modules = map(__import__, moduleNames)

Dynamic module import in Python

响应OP评论更新:

如果您不想使用内置python库来动态导入模块,那么您将无法动态导入模块,除非您想编写自己的库来复制其行为。

使用importlib发布错误/问题,或者只是静态导入您的库并通过if语句路由您的线程。

答案 1 :(得分:0)

如果您没有尝试导入完全任意的模块而只需要从列表中选择,则可以使用if-else块(或其他类似的构造)。通常这样做是为了解决Python 2.7与3.x中不同的导入。

这是在两个导入之间进行选择的简单方法:

def myfun(module_name):
    if module_name == 'A':
        import module_a as module
    else:
        import module_b as module
    module.foo()