假设我有这种准系统结构:
project/
main.py
providers/
__init.py__
acme1.py
acme2.py
acme3.py
acme4.py
acme5.py
acme6.py
假设main.py
包含(部分):
if complexcondition():
print providers.acme5.get()
__init__.py
为空,acme*.py
包含(部分):
def get():
value=complexcalculation()
return value
如何更改这些文件?
注意:如果答案是“import acme1”,“import acme2”等等__init__.py
,那么有没有办法实现这一点而不用手动列出所有内容?
答案 0 :(得分:6)
哎!两年后但......可能对某人有所帮助
将 providers / __ init __。py 设为:
import os
import glob
module_path = os.path.dirname(__file__)
files = glob.glob(os.path.join(module_path, 'acme*.py'))
__all__ = [os.path.basename(f)[:-3] for f in files]
如果添加或删除任何提供商/ acme * .py
,您无需在以后更改然后在 main.py
中使用from providers import *
答案 1 :(得分:5)
如果我正确地阅读了您的问题,看起来您似乎没有尝试进行任何动态导入(例如Van Gale提到的问题)但实际上只是尝试导入提供程序包中的所有模块。如果是这种情况,在__init__.py
中你会想要这个陈述:
__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]
然后导入您将使用的所有内容... import *
from providers import *
然后代替在代码中显式使用包名称,您只需调用导入的类
acme1.get()
acme2.get()
如果提供程序包中有足够的模块,填充__all__
列表就会出现问题,您可能需要考虑将它们分解为更小的包或以其他方式存储数据。我个人不希望每次想要重新使用包时都要处理动态导入schennagins。
答案 2 :(得分:3)
今天提出的这个问题,Dynamic Loading of Python Modules,应该有你的答案。