【问题标题】:Python: Import all objects from library by variablePython:通过变量从库中导入所有对象
【发布时间】:2021-10-18 16:31:19
【问题描述】:

我想通过变量从库中导入所有对象。我知道如何从库中导入所有对象:

from package import *

我知道如何通过变量导入库:

import importlib

var = 'package'
package = importlib.import_module(var)

但是,我无法弄清楚如何将这两个目标结合起来。 importlib.import 似乎不支持这一点。有人可以帮忙吗?

注意:我知道以这种方式绕过命名空间的危险(任何对我的询问使用潜在答案的人都应该熟悉这些危险)。我只打算用它来快速开发和测试一些算法,并计划用我的文件中的各个对象的明确名称来发布我的代码。

编辑:我想出了一个最小的例子。假设我在同一个目录中有三个文件:

aux1.py

var = 'aux2'

aux2.py

a = 0
b = 1

main.py

import importlib

from aux1 import var
aux2 = importlib.import_module(var)

如果我运行 main.py,我可以访问 ab 作为 aux2.aaux2.b,但我希望它们成为全局变量。要执行此操作,main.py 的最后一行需要是什么?

【问题讨论】:

    标签: python import python-importlib


    【解决方案1】:

    您可以遍历从import_module 返回的模块的__dict__ 属性,如果它不以__ 开头,则将该项目添加到globals()

    import importlib
    
    var = 'package'
    package = importlib.import_module(var)
    
    for name, value in package.__dict__.items():
        if not name.startswith("__"):
            globals()[name] = value
    

    如果您只想导入package 的某些成员,您可以使用getattr(),默认为None

    imports = ['obj1', 'obj2', 'obj3']
    for name in imports:
        value = getattr(package, name, None)
        if value is not None:
            globals()[name] = value
    

    【讨论】:

    • 这个策略肯定行得通,而且这是我自己能想出的唯一主意。我想知道是否有更内置的方法可以使用importlib(或其他一些)包来做到这一点。如果很明显不是这种情况,我肯定会接受你的回答,因为它有效。
    • 我认为没有内置的方法可以做到这一点。如果你真的想经常使用这个功能,把它放在你自己的函数/模块中很容易。既然你不打算在生产代码中使用它,我就把它放在我本地安装的一个模块中。
    【解决方案2】:
    import_module(name, package=None):
        """Import a module.
        The 'package' argument is required when performing a relative import. It
        specifies the package to use as the anchor point from which to resolve the
        relative import to an absolute import.
        """
    

    这是import_module(...)方法的初始化。在名称后添加逗号并放置锚点的位置(引用文件的起始文件夹;例如“C:\Program Files\Java”)。第二个参数基本上就像你的 from,只使用绝对路径。

    【讨论】:

    • 我听不懂你的回答;我可能还不够流利地使用 Python。我花了一段时间,但我想出了一个可以促进更具体答案的最小示例:)
    • 顺便说一句,这不是我的反对意见。
    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多