【发布时间】: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 工作得非常好,我只是想知道是否有更清洁或更惯用的方式来做到这一点。
【问题讨论】:
-
@jezza_99 我不明白这是如何回答这个问题的。 OP 询问如何在不将模块对象分配给变量的情况下执行导入。这个问题是关于卸载/重新加载导入的模块。
标签: python python-import