在封装SDK的过程中,为了避免用户使用
import
导包语句特别冗长难看, 记录一下优化的过程, 或者应该说是必须掌握的基础。
- 重点查看
__init__.py
和main.py
的导包语句写法 - 在包内部,使用相对路径互导的写法,参考aaa.py模块,在代码顶部使用了相对路径方式导入了ccc.py模块的函数
目录结构
Project
├─ main.py //用户程序示例
└─ plugin //存放不同插件的文件夹
└─ Meow //Meow插件文件夹
├─ info.py //Meow插件入口文件,名称自定义
├─ __init__.py //标识当前目录为包的文件, 可以为空, 但我们需要写这个
├─ service //包内部的一个模块文件夹
│ └─ aaa.py //aaa模块,这里使用相对路径引入了包内其他文件夹的ccc模块函数
└─ modules //包内部的一个模块文件夹
├─ bbb.py //bbb模块
└─ ccc.py //ccc模块
main.py
用户程序示例,可以看到这里的导包语句已经非常简洁明了,当然需要在写好__init__.py
之后才能生效。实现了简洁的导入、调用Meow
包内部不同文件夹、不同模块内部的多个函数。
from plugin.Meow import package_abc, module_aaa, service_bbb, service_ccc
# 直接运行info.py中的函数, 它直接包含了所有功能
package_abc()
# 当然内部函数也可以直接分别运行
module_aaa()
service_bbb()
service_ccc()
plugin/Meow/__init__.py
from .info import package_abc
from .modules.aaa import module_aaa
from .service.bbb import service_bbb
from .service.ccc import service_ccc
plugin/Meow/info.py
from .modules.aaa import module_aaa
from .service.bbb import service_bbb
def package_abc():
module_aaa()
service_bbb()
print("提示: package_abc函数执行完毕\n")
plugin/Meow/modules/aaa.py
- 相对路径导包时,在from后方,使用两个半角点”..“来进入上一级
- 此处的
from ..service.ccc import service_ccc
代表:回到上一级目录、进入service文件夹、引入ccc.py文件中的service_ccc
函数
from ..service.ccc import service_ccc
def module_aaa():
print("module_aaa函数")
# 这里我们在module_aaa内部调用相对路径导入的service_ccc函数
service_ccc()
plugin/Meow/service/bbb.py
def service_bbb():
print("service_bbb函数")
plugin/Meow/service/ccc.py
def service_ccc():
print("service_ccc函数")