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

发布于 2021-01-29 15:24:10

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

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

谢谢。

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我想出了一些难看的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')
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看