Python动态导入和__all__

3
我面临一个行为问题,尽管我觉得这是一个非常基本的问题,但我仍然不理解它...

想象一下你有一个Python包 mypackage ,其中包含一个名为 mymodule 的模块,该模块有两个文件 __init__.pymy_object.py。 最后一个文件包含一个名为 MyObject 的类。

我正在尝试在 __init__.py 中编写自动导入代码,其等效于以下内容:

__init__.py

__all__ = ['MyObject']
from my_object import MyObject 

为了能够做到以下操作:
from mypackge.mymodule import MyObject

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

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

有人能帮我解决这个问题吗?

非常感谢!


你可以直接过滤 vars(mod).items() 而不必使用 inspect - Davis Herring
1个回答

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接