在Python中优雅的导包:使用__init__.py,以及相对路径写法

在封装SDK的过程中,为了避免用户使用import导包语句特别冗长难看, 记录一下优化的过程, 或者应该说是必须掌握的基础。

  • 重点查看__init__.pymain.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

  1. 相对路径导包时,在from后方,使用两个半角点”..“来进入上一级
  2. 此处的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函数")
暂无评论

发送评论 编辑评论


				
上一篇
下一篇