模块与包---模块的相对导入和绝对导入

绝对导入

没有 . 或者..的导入就是绝对导入

绝对导入的路径就是从top-level 一层一层往下数

top-level

哪个作为主程序直接运行,那这个模块所在的目录就是top-level

img

当前在mod.py文件中,所以mod文件是主程序,跟mod文件同级的pack01、pack02模块就是top-level层

from pack01.subpack01 import subpk01

相对导入

模块路径由 . 开始的导入就是相对导入

. 表示当前这一级,.. 表示上一级,... 表示上上级,依次类推

相对导入不能识别到top-level那一层,只能识别到top-level以下层

img

subpk01模块:

print("i am subpk01")

from ..subpack02 import subpk02

subpk02模块:

print("i am subpk02")

此时不能直接运行subpk01模块,会报错

from ..subpack02 import subpk02
ImportError: attempted relative import with no known parent 

因为在subpk01模块中使用了相对路径导入subpk02,而此时运行subpk01模块说明subpk01是主程序,此时的top-level是subpk01,相对导入只能识别到top-level以下层,所以会报出导入错误

但是可以在mod模块中导入subpk01模块,因为此时mod作为主程序,是top-level,pack01也是top-level,所以subpk01的上一级subpack02也在top-level以下层,可以识别到,所以在mod模块中再导入subpk01模块不会报错:

from pack01.subpack01 import subpk01
# i am subpk01
# i am subpk02

如果将subpk01模块中改为:

print("i am subpk01")

from ...pack01.subpack02 import subpk02

然后在mod模块中导入,会报错

因为…表示subpk01模块的上两级pack01,而pack01与mod同级,是top-level,不能识别到pack01这一级

from pack01.subpack01 import subpk01

# from ...pack01.subpack02 import subpk02
# ValueError: attempted relative import beyond top-level package

subpk01中也可以绝对导入subpk02模块

print("i am subpk01")

from pack01.subpack02 import subpk02

运行mod文件:

from pack01.subpack01 import subpk01

# i am subpk01
# i am subpk02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值