当前位置: 首页 > 面试题库 >

从模块动态导入所有内容(*)

施季
2023-03-14
问题内容

我有一个要动态导入的Python模块,仅给出了模块名称的字符串。通常,我使用importlibor
__import__,并且在我知道我想从模块中导入哪些对象的情况下,效果很好,但是有一种方法可以等效import *地动态进行。还是有更好的方法?

我一般都知道使用它是一种不好的做法,import *但是我尝试导入的模块是在运行时自动生成的,而且我无法知道包含要处理的类的确切模块。

谢谢。


问题答案:

我想出了一些难看的hacky代码,它可以在python 2.6中使用。我不确定这是否是最聪明的事情,也许这里的其他一些人有一些见识:

test = __import__('os',globals(),locals())
for k in dir(test):
    globals()[k] = test.__dict__[k]

您可能希望在此处进行检查,以确保不会覆盖全局名称空间中的任何内容。您可能会避免使用globals部分,而只浏览感兴趣的类的每个动态导入的模块。这可能比用导入的所有内容污染全局名称空间要好得多。

例如,假设您的类名为urllib2中的“请求”

test = __import__('urllib2',globals(),locals())
cls = None
if 'Request' in dir(test):
    cls = test.__dict__['Request']
    # you found the class now you can use it!
    cls('http://test.com')


 类似资料: