• Python 相对导入attempted relative import beyond top-level package


    ValueError: attempted relative import beyond top-level package

    假设有如下层次包目录

     1 project/
     2     __init__.py
     3     mypackage/
     4         __init__.py
     5         A/
     6             __init__.py
     7             spam.py     #* print("In spam") *#
     8             grok.py     #* print("In grok") *#
     9             C/
    10                 __init__.py
    11                 hello.py    #* print("In hello") *#
    12         B/
    13             __init__.py
    14             bar.py      #* print("In bar") *#
    15         run.py
    16     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的 __name__ 为 __main__
      • 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

    例子

    ## run.py (run.py当作顶层执行模块,即 python run.py)
    #-----------
     
    import A.spam
     
    
    
    ## spam.py
    #--------------
     
    from . import grok      # ok
    from .C import hello    # ok
    from ..B import bar     # !Err 
                                                               ##—— ValueError: attempted relative import beyond top-level package
    print('In spam') 
     
    
    
    ## main.py
    #------------
    
    import mypackage.A.spam
     
    
    
    
    
    ## spam.py
    #-------------
     
    from ..B import bar     # ok
    print('In spam')
     
  • 相关阅读:
    eslint自动格式化
    焕肤功能
    Web Components
    Webpack 中的 sideEffects
    andriod 新建Activity_ Form
    那么唯美
    C# PDF添加水印
    停止触发器
    sp_sys_ERPTrigger_base
    sql语句返回主键SCOPE_IDENTITY()
  • 原文地址:https://www.cnblogs.com/linkenpark/p/10909523.html
Copyright © 2020-2023  润新知