我希望做什么
我想要导入一个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)很好用,只是我想知道是否有更干净或更惯用的方法来做到这一点。