【问题标题】:Import a Python module without adding it to the local namespace导入 Python 模块而不将其添加到本地命名空间
【发布时间】:2021-12-02 01:33:42
【问题描述】:

我想做的事

我想导入一个 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 的引用的副作用,但现在已经完成,我不再需要它们在我的命名空间中,因为我将使用 @987654333 @。

我知道我可以把它们留在那里,但这会进入__init__.py,所以我想整理一下那个命名空间。

del 工作得非常好,我只是想知道是否有更清洁或更惯用的方式来做到这一点。

【问题讨论】:

标签: python python-import


【解决方案1】:

如果要导入模块而不将模块对象分配给变量,可以使用importlib.import_module并忽略返回值:

import importlib

importlib.import_module("foo")

请注意,使用importlib.import_module 比直接使用__import__ 内置函数更可取。详情请见builtin documenation

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多