gpt4 book ai didi

Python 动态导入和 __all__

转载 作者:行者123 更新时间:2023-12-04 18:06:04 26 4
gpt4 key购买 nike

即使我觉得这是一个非常基本的问题,我仍面临着一种我不理解的行为...

假设您有一个 python 包 mypackage包含一个模块 mymodule有 2 个文件 __init__.pymy_object.py .最后一个文件包含一个名为 MyObject 的类.

我正在尝试在 __init__.py 中调整自动导入这相当于:

__init__.py

__all__ = ['MyObject']
from my_object import MyObject

为了能够做到:

from mypackge.mymodule import MyObject

我想出了一个用所有类名填充all 的解决方案。它使用 __import__ (也尝试了 importlib.import_module() 方法)但是当我尝试导入 MyObject 时来自 mymodule ,它一直告诉我:

ImportError: cannot import name MyObject

这是我开始的脚本:

classes = []
for module in os.listdir(os.path.dirname(__file__)):
if module != '__init__.py' and module[-3:] == '.py':

module_name = module[:-3]
import_name = '%s.%s' % (__name__, module_name)

# Import module here! Looking for an equivalent to 'from module import MyObject'
# importlib.import_module(import_name) # Same behaviour
__import__(import_name, globals(), locals(), ['*'])

members = inspect.getmembers(sys.modules[import_name], lambda member: inspect.isclass(member) and member.__module__.startswith(__name__) )

names = [member[0] for member in members]
classes.extend(names)

__all__ = classes

有人可以在这一点上帮助我吗?

非常感谢,

最佳答案

您只需要在模块上分配属性:globals().update(members)

关于Python 动态导入和 __all__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26557930/

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