首页 > 其他分享 >Import 相对导入中遇到的问题总结

Import 相对导入中遇到的问题总结

时间:2024-03-03 20:11:04浏览次数:24  
标签:总结 __ -- py 导入 B1 import Import

这是我写的第一遍博客,晚上6点52,有点困,大概写一下。

一、包(Package)、模块(Modules)、脚本(Script)

搞清楚什么是包、什么是模块、什么是脚本很重要,简单来说:

  1. Script 是用来运行的,也就是 "__name__" == "__main__"成立的.py文件
  2. Modules 是一大堆 Class funtion的合集,我们希望它的"__name__" == "__main__"成立
  3. Package 是 Modules 的合集,可以有复杂的文件层级目录。一般而言(老版本的python是强制的)加上__init__.py可以被视为是一个包。

二、Import 相对导入的初衷

这个可以从官网的tutorial可以得见。看官们请注意,下图中的.py文件是不是都是 Module 模块?



这就说明相对导入的目的是为了让模块之间产生关系。
如果试图在Module上运行的时候,已经违背了他的初衷。(应该是Script的作用不是吗?)

三、失败案例

理解了初衷就不难发现,下面这串代码罔顾初衷,试图让不在同一个Package内的两个文件用相对导入发生关系,注定是失败的。(注意,baseline是最大的包,跳出这个文件就是包之外了,project不能成为baseline的parent包,因为train.ipynb作为一个脚本不是包的一部分,所以project文件不是包)

project/
|-- baselines/
|   |-- ViT/
|       |-- ViT_LRP
|-- src/
    |-- train.ipynb
    |-- __init__.py

在如图所示的层级结构上,在train.ipynb上面输入from ..baselines.ViT.ViT_LRP import FGM,会显示ImportError: attempted relative import with no known parent package

四、成功案例

project/
|-- pkg.py
  |-- A
  |   |-- A1.py
  |-- B
      |-- B1.py
      |-- B2.py
|-- C_test.py

其中,B1.py如下,

from .B2 import B2_f
from ..A.A1 import A1_f

def B1_f():
    print("hello, this is B1")

直接运行B1.py后,报错(两个都无法导入):
ImportError: attempted relative import with no known parent package

但是用C_test.py完美运行(均成功导入):

>> from B.B1 import B2_f,A1_f
>> A1_f()

Output: hello, this is A1

五、拓展

本文在表面上粗略介绍了import相对导入遇到的问题,总之包就是包,脚本是脚本。如果用脚本还是建议用绝对路径 Import。

如果想从深入的角度了解背后的原因,可以参考B站某UP讲解,醍醐灌顶。

标签:总结,__,--,py,导入,B1,import,Import
From: https://www.cnblogs.com/sq-feng/p/18050602

相关文章

  • 2023-2024第一学期助教工作总结
    一、助教工作的具体职责和任务我每周都会帮助老师批改作业,可以及时了解课程的进度和学生的学习情况。我负责整理学生的问题和反馈。此外,当学生遇到学习问题我可以解决时,我会积极帮助。同时,经过上一次总结,留意到很多同学说会忘记作业截止时间导致没有交上作业,我会提前在qq群里提醒......
  • 【2023-2024第一学期】助教工作学期总结
    一、助教工作的具体职责和任务协助系里制作材料整理帮助老师批改作业回答学生问题二、助教工作的每周时长和具体安排每周四个小时批改作业实验课帮助老师给同学排错反馈同学问题,安排实验时间三、因为自己的助教工作,对课程、老师、学生的帮助和带来的改变(典型案例说明)自己对于......
  • 错误总结
    else总会和最近的if配对,所以勤加大括号。不要#defineintlonglong!!!。不要把i和j写反。使用STL容器前(队列、栈等),无论执行什么操作,都要先判空。在找最值时初始值最好设为1e9+31。写完爆搜,如果想不到其他思路,记得想想剪枝和记忆化。如果感觉某道题只......
  • 助教2023-2024第一学期工作总结(计算机网络)
    一、助教工作的具体职责和任务 (包括:你和老师是如何配合的、你和课程其他助教是如何配合的(如果有的话))1.及时跟进学生学习进度每周询问老师教学进度,自己复习知识点,随时准备回复学生问题,并对后续进行安排2.编写题目,拓宽题库每周编写5-8题题目,写出答案,并发给老师审核3.和老师......
  • 每日总结
    publicclassB{    publicstaticBt1= newB();    publicstaticBt2= newB();    {      System.out.println("构造块");    }    static    {      System.out.println("静态块");    }    publicstatic......
  • 助教总结报告
    一、助教工作的具体职责和任务1.了解进度与知识点每周我都会与老师进行交流,以了解教学的进度和相关知识点。这样我可以为接下来的课程做好充分的准备。2.课前准备在课前,我会根据学生提交的作业情况,向老师反馈作业的批改结果,并提供个人的建议。我会确保自己熟练掌握了相关的知识......
  • 助教工作总结(教学办助理)
    一、助教工作的具体职责和任务1.老师的配合:协助老师完成档案室档案的转移协助老师整理专升本及本科批次学生毕业设计档案材料整理协助老师将2023年上学期试卷整理入库2.与课程其他助教的配合:共同完成了2023年上学期期末试卷的装订共同协助老师完成......
  • C#性能优化总结
    1.ef查询数据库的时候一定要先写好条件查询最后再ToList(),一个方法最好只查询一次数据库。2.有的方法效率低查询慢,是因为更好的理解业务,没有想好到的查询快的办法。3.查询条件的先后顺序,字段加索引,表的数据量,join查询都是影响查询效率的因素。4.前端绑定数据,js写法,网络请求,页面......
  • 周赛Round26总结1
    预计得分500,实际得分400,挂了20+50+30分。T1移动move题目描述:\(n\)个二维向量\((X_{i},Y_{i})\),随便选择\(k\)个,其中\(0<=k<=n\),起点是\((0,0)\),每次移动后的位置是\((s+x_{i},t+y_{i})\),求终点\(|s|+|t|\)的最大值。分析:分类讨论。\((X_{i},Y_{i})\)可以分到四个......
  • YL 模拟赛总结 5
    ProblemT1\(m\)个人中间必定有\(m-1\)个空位,剩下\(n-m+1\)个位置可以随意放人,则方案数为\(A^{m}_{n-m+1}\)。T2考虑进行\(dp\)。状态:令\(dp_{i,j}\)表示字符串\(S_{i\simj}\)要变成回文串需要添加的最少字符数。转移:枚举区间左端点\(l\)和长度\(k\),右端点......