python模块的相对导入

包中层次如下:

project/
    __init__.py
    mypackage/
        __init__.py
        A/
            __init__.py
            spam.py     #* print("In spam") *#
            grok.py     #* print("In grok") *#
            C/
                __init__.py
                hello.py    #* print("In hello") *#
        B/
            __init__.py
            bar.py      #* print("In bar") *#
        run.py
    main.py
 

相对导入语法:

from . import module
from .. import module
from ... import module

相对导入与模块__name__有关

run.py作为顶层模块执行导入A.spam时

  • run.py的__name__ 等于 main
  • spam.py的__name__ 等于 A.spam
  • A成为顶层的包,所以相对导入最多​只能访问到A,A之外的层次结构是不可见的

main.py作为顶层模块执行导入mypackage.A.spam是

  • main.py的 namemain
  • spam.py的__name__ 为 mypackage.A.spam
  • mypackage成为顶层包,相对导入作用域扩大,B/包对spam.py可见

相对导入只适用于包中的模块,顶层的模块中将不起作用

如果将run.py当作顶层执行模块

  • A/ 和 B/ 将成为 toplevel package 顶层包 A/中的模块不能用相对导入来导入B/包中的模块,因为不能越过顶层包。
  • A/、B/ 包中的目录可以导入本包中及以下的模块

如果将main.py当作顶层执行模块

  • mypackage/成为顶层包,A/可以访问到B/包,不会出现
ValueError: attempted relative import beyond top-level package

注意:

  • 相对导入不能再执行文件中使用
  • 相对导入只能在被导入的模块中使用,使用相对导入,就不需要考虑执行文件到底是谁了,只需要直到模块与模块之间路径的关系
发布了84 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39852676/article/details/102502320