我面临一个行为问题,尽管我觉得这是一个非常基本的问题,但我仍然不理解它...
为了能够做到以下操作:
想象一下你有一个Python包 mypackage
,其中包含一个名为 mymodule
的模块,该模块有两个文件 __init__.py
和 my_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