• 欢迎访问DBA的辛酸事儿,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站
  • 欢迎大家关注博主公众号:DBA的辛酸事儿
  • 博文中若有错误的地方,请大家指正,大家的指正是我前进的动力

Python:关于py文件之间相互import的问题

python SEian.G 3年前 (2021-11-15) 1476次浏览 已收录 0个评论

在开发调试脚本的时候,遇到一个问题:ImportError: cannot import name ‘A’ from ‘study_case.a’

具体问题情况是这样的:

前些日子写了一个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

    @staticmethod
    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))

文件结构如下:

Python:关于py文件之间相互import的问题

按照上面这种写法,运行a或b,都会报错,如下

Python:关于py文件之间相互import的问题

解决方法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))

Python:关于py文件之间相互import的问题


如果您觉得本站对你有帮助,那么可以收藏和推荐本站,帮助本站更好地发展,在此谢过各位网友的支持。
转载请注明原文链接:Python:关于py文件之间相互import的问题
喜欢 (2)
SEian.G
关于作者:
用心去记录工作,用心去感受生活,用心去学着成长;座右铭:苦练七十二变,笑对八十一难
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址