gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:36:43 30 4
gpt4 key购买 nike

我想做什么

我想导入一个 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 工作得很好,我只是想知道是否有更简洁或更惯用的方法来做到这一点。

最佳答案

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

import importlib

importlib.import_module("foo")

请注意,使用 importlib.import_module 比直接使用 __import__ 内置的简单用法更可取。查看builtin documenation了解详情。

关于python - 导入 Python 模块而不将其添加到本地命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70193239/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com