通过字符串导入模块时,使用 "import * from module"。

10 浏览
0 Comments

通过字符串导入模块时,使用 "import * from module"。

我知道可以使用importlib通过字符串来导入模块。我如何使用这个库来重新创建import *的功能?基本上,我想要像这样的东西:importlib.import_module(\'path.to.module\', \'*\')我故意不对导入的属性进行命名空间处理的原因。

0
0 Comments

问题的原因是,有时我们需要根据字符串的形式导入一个模块,但是直接使用import语句无法实现这个功能。解决这个问题的方法是使用importlib库中的import_module()函数来导入模块,并使用globals().update()函数将导入的模块中的变量添加到全局命名空间中。

具体的解决方法如下:

import importlib
# 导入模块
mod = importlib.import_module('collections')
# 将变量添加到全局命名空间中
globals().update(mod.__dict__)

需要注意的是:

- 这种方法会导入除了用户定义的变量之外的很多其他内容。

- 上述解决方案在尽可能只导入用户定义的变量方面做得很好。

通过以上方法,我们可以根据字符串的形式导入模块,并将其变量添加到全局命名空间中,以便在代码中使用这些变量。

0
0 Comments

(Import * from module by importing via string)这个问题的出现的原因以及解决方法:

问题原因:

在Python中,我们可以使用import关键字来导入一个模块,通过这种方式,我们可以使用模块中定义的函数、类和变量。有时候,我们希望从一个模块中导入所有的内容,可以使用通配符*来实现,例如from module import *。然而,有时候我们需要通过字符串的形式来导入模块,例如importlib.import_module('module')。在这种情况下,直接使用通配符*来导入模块中的所有内容是不起作用的。

解决方法:

为了解决这个问题,我们可以使用importlib模块中的import_module函数来导入模块,并且使用getattr函数来获取模块中的所有可导入的内容。然后,我们可以将这些内容逐一复制到当前的命名空间中,以便我们可以直接使用它们。

以下是解决方法的代码示例:

import importlib
# 导入模块
mod = importlib.import_module('collections')
# 确定要复制到当前命名空间的名称列表
names = getattr(mod, '__all__', [n for n in dir(mod) if not n.startswith('_')])
# 将这些名称复制到当前命名空间中
g = globals()
for name in names:
    g[name] = getattr(mod, name)

通过以上的解决方法,我们可以通过字符串的形式导入一个模块,并且使用通配符*来导入模块中的所有内容。这样,我们就可以在当前的命名空间中直接使用导入的模块中的函数、类和变量了。

0