ara*_*ius 3 python module package
假设我有这个准系统结构:
project/
main.py
providers/
__init.py__
acme1.py
acme2.py
acme3.py
acme4.py
acme5.py
acme6.py
Run Code Online (Sandbox Code Playgroud)
假设main.py包含(部分):
if complexcondition():
print providers.acme5.get()
Run Code Online (Sandbox Code Playgroud)
哪里__init__.py是空的并且acme*.py包含(部分):
def get():
value=complexcalculation()
return value
Run Code Online (Sandbox Code Playgroud)
如何更改这些文件?
注意:如果答案是"import acme1","import acme2"等等__init__.py,有没有办法实现这一点而不用手动列出它们?
嘿!两年后但......可能对某人有所帮助
使你的provider/__ 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]
Run Code Online (Sandbox Code Playgroud)
如果添加或删除任何provider/acme*.py,您不必在以后更改它
然后from providers import *在main.py中使用
如果我正确地阅读你的问题,看起来你似乎没有尝试进行任何动态导入(比如Van Gale提到的问题),但实际上是在尝试只导入provider包中的所有模块.如果是这种情况,__init__.py你会希望得到这样的声明:
__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]
Run Code Online (Sandbox Code Playgroud)
然后导入您将使用的所有内容... import*
from providers import *
Run Code Online (Sandbox Code Playgroud)
然后,您只需调用导入的类,而不是在代码中显式使用包名称
acme1.get()
acme2.get()
Run Code Online (Sandbox Code Playgroud)
如果提供程序包中有足够的模块,填充__all__列表就会出现问题,您可能需要考虑将它们分解为更小的包或以其他方式存储数据.我个人不希望每次我想重新使用包时都要处理动态导入schennagins.
| 归档时间: |
|
| 查看次数: |
5872 次 |
| 最近记录: |