python中关于py文件之间相互import的问题及解决方法
作者:我是冰霜 发布时间:2021-08-29 00:29:33
问题背景
调试脚本时,遇到一个问题:ImportError: cannot import name 'A' from 'study_case.a' (/Users/rchera/PycharmProjects/test/study_case/a.py)
具体情况是这样婶儿的:
前些日子写了一个py文件,它的功能主要是创建数据(暂且称为create_data.py,每条数据会生成一个唯一的id);
同时写了另一个py文件,它的功能主要是操作数据,例如对数据进行编辑、删除等(暂且称为operate_data.py);
要对数据进行操作的话,必须传入数据对应的唯一id,所以在operate_data.py中导入了create_data.py中生成数据的方法
至此,一切都很顺利,还没有什么问题
由于一些情况,我需要在生成一条数据后,紧接着要把它删除,
开始打算直接在create_data.py中再写一个删除数据的方法,不过后来想到之前已经在operate_data.py中定义好删除数据的方法了,
这样的话,直接在create_data.py中导入operate_data.py,引用其删除数据的方法应该也行
但是实际却并未按照预想的那样,按照上面的想法调好脚本后,create_data.py和operate_data.py都无法运行了,会提示顶部列出的错误~
在网上搜索了一下,大致原因是:create_data.py和operate_data.py两个文件互相调用了
当然并不是说python不能循环引用,只是我的写法有问题,然后我继续深入搜索了一番,在一些大神的博客里找到了解决方法
参考文章:
https://fishc.com.cn/forum.php?mod=viewthread&tid=60873&page=1#pid2337627
https://www.zhihu.com/question/19887316
https://blog.igevin.info/posts/how-to-avoid-python-circle-import-error/
ps.大神都建议不要在python中交叉循环引用(即不要在a中调用b,然后b中又调用a),最好规划好代码的层级,哪些是公共方法,哪些是业务逻辑,把这些提前想好,有利于后期的维护~
OK,接下来按照网上给出的方法,用一个例子演示下如何解决python中循环引用的问题
实例演示
准备2个py文件
a.py
from study_case.b import B
class A:
@staticmethod
def a1(number):
return number * number
def a2():
value = B().b(1)
return value
if __name__ == '__main__':
t = A()
print(t.a1(2))
b.py
from study_case.a import A
class B:
@staticmethod
def b(x):
value = A().a1(1)
return value + x
if __name__ == '__main__':
t = B()
print(t.b(1))
文件结构如下
按照上面这种写法,运行a或b,都会报错,如下
解决方法1:在文件的顶部引入,不要用from
,使用绝对引入
例如,修改b.py文件内容如下,直接引入a文件
import study_case.a
class B:
@staticmethod
def b(x):
value = study_case.a.A().a1(1)
return value + x
if __name__ == '__main__':
t = B()
print(t.b(1))
不过我试了下,如果用from的话,只导入a文件这个层级,也不会报错,如下
from study_case import a
class B:
@staticmethod
def b(x):
value = a.A().a1(1)
return value + x
if __name__ == '__main__':
t = B()
print(t.b(1))
解决方法2:函数顶部引入,可以用from
例如,修改b.py文件内容如下,在函数名下方第一行引入a文件的类
class B:
@staticmethod
def b(x):
from study_case.a import A
value = A().a1(1)
return value + x
if __name__ == '__main__':
t = B()
print(t.b(1))
来源:https://www.cnblogs.com/hanmk/p/13402910.html


猜你喜欢
- 本文实例为大家分享了python实现二叉树的遍历具体代码,供大家参考,具体内容如下代码:# -*- coding: gb2312 -*- c
- 手写数字识别(小白入门)今早刚刚上了节实验课,关于逻辑回归,所以手有点刺挠就想发个博客,作为刚刚入门的小白,看到代码运行成功就有点小激动,这
- 做python项目时,想安装某个依赖包的最新版本,但又不知道它的版本号具体到多少,因此需要搜索查看它的相关简介信息.原来的时候,可以直接通过
- Pytest-sugar是一款用来改善控制台显示的插件,增加了进度条显示,使得在用例执行过程中可以看到进度条,而且进度条是根据用例是否通过标
- python中,我们可以对列表、字符串、元祖中的元素进行排序,那对于字典中的元素可以排序吗?其实对于字典本身我们无法进行排序,但是我们可以对
- 本文实例为大家分享了JavaScript实现贪吃蛇的具体代码,供大家参考,具体内容如下首先我们要确定贪吃蛇应有的功能1.通过键盘的上下左右控
- 本文实例讲述了Python基础之条件控制操作。分享给大家供大家参考,具体如下:if 语句Python中if语句的一般形式如下所示:if co
- JDBC是由java编程语言编写的类及接口组成,同时它为程序开发人员提供了一组用于实现对数据库访问的JDBC API,并支持SQL语言。利用
- Accessibility—-可访问性/无障碍访问Accessibility在此处指网页的可访问性。W3C的网页可访问性定义如下:“网页可访
- 本文实例为大家分享了python绘制柱形图的具体代码,供大家参考,具体内容如下#柱形图import pandasimport numpyim
- 最近博主在边学flask边写测试平台,碰到一个比较常用的场景如下图所示这里有一个输入框组,下拉菜单里面有3个选项,还有一个输入框,代码是用
- 前言Python语言的turtle库是一个直观有趣的图形绘制函数库,是python语言标准库之一。turtle库也叫海龟库,是turtle绘
- 导语🎼嗨,大宝贝们,又到周末啦,今天你放假了嘛?周末的日子总是无所事事,无所事事。一直在想做什么游戏,给大家来点儿新鲜感,这不?玩游戏、找游
- 一、当前时间戳获取当前时间戳,即当前系统内表示时间的一个浮点数import timetime.time()二、获取当前时间字符串获取当前时间
- OOM全称"Out Of Memory",即内存溢出。内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作
- 左右结构是平常页面中最经常看到的结构,简洁一些的页面就会使用边框将左右两边隔开,但往往由于左右两边的内容可能是不等高的,所以就会有一高一低的
- 今天把博客的日历脚本又改了一改,就帖上了,以后找起来方便一点,同时也给需要的人带来方便,本来还想加点功能再帖上来,不过我看还是没必要了,帖的
- Pycharm要激活至2099年,首先必须要先找到这个东西:JetbrainsCrack-2.6.10-release-enc.jar,我上
- 目录ORM是什么实现ORM中的insert功能完善对数据类型的检测抽取到基类中添加数据库驱动执行sql语句添加数据库驱动执行sql语句测试功
- 最近用sysbench进行了较多的性能测试,也总结一下它的特点和用法和需要注意的事项。sysbench是一个多线程性能测试工具,可以进行CP