不将Python模块添加到本地命名空间而导入。

3

我希望做什么

我想要导入一个Python模块,但不将其添加到本地命名空间中。

换句话说,我想要做到这一点:

import foo
del foo

有没有更简洁的方法来实现这个?

为什么我想要这样做

简短地说,导入foo会产生我想要的副作用,但是我不希望它留在我的命名空间中。

详细地说,我有一个基类,它使用__init_subclass__()来注册它的子类。因此,base.py看起来像这样:

class Base:
    _subclasses = {}

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls._subclasses[cls.__name__] = cls

    @classmethod
    def get_subclass(cls, class_name):
        return cls._subclasses[class_name]

这些类及其子类在不同的文件中定义,例如foo_a.py

from base import Base

class FooA(Base):
    pass

等等。

这里的净效应是,如果我执行

from base import Base

print(f"Before import: {Base._subclasses}")

import foo_a
import foo_b

print(f"After import: {Base._subclasses}")

然后我会看到

Before import: {}
After import: {'FooA': <class 'foo_a.FooA'>, 'FooB': <class 'foo_b.FooB'>}

所以我需要导入这些模块来添加对“Base._subclasses”的引用副作用,但现在已经完成了,我不再需要它们存在于我的命名空间中,因为我只会使用“Base.get_subclass()”。
我知道我可以把它们留在那里,但这将进入一个“__init__.py”,所以我想整理一下这个命名空间。
删除(del)很好用,只是我想知道是否有更干净或更惯用的方法来做到这一点。

这个回答解决了你的问题吗?如何取消导入已经导入的Python模块? - jezza_99
@jezza_99 我不明白那如何回答这个问题。OP正在询问如何执行导入而不将模块对象分配给变量。那个问题是关于卸载/重新加载已导入的模块的。 - Brian61354270
1个回答

3
如果您想导入一个模块但不需要将模块对象赋值给变量,可以使用importlib.import_module并忽略返回值:
import importlib

importlib.import_module("foo")

请使用`importlib.import_module`代替直接使用`__import__`内置函数进行简单的导入操作。详细信息请参阅内置文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接