python中关于py文件之间相互import的问题及解决方法

 更新时间:2022年02月21日 11:19:15   作者:我是冰霜  
这篇文章主要介绍了python中关于py文件之间相互import的问题,本文用一个例子演示下如何解决python中循环引用的问题,需要的朋友可以参考下

问题背景

调试脚本时,遇到一个问题: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))

到此这篇关于python中关于py文件之间相互import的问题的文章就介绍到这了,更多相关python py文件import内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用豆瓣提供的国内pypi源

    使用豆瓣提供的国内pypi源

    PyPI(Python Package Index)是python官方的第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到PyPI。PyPI推荐使用pip包管理器来下载第三方库。
    2017-07-07
  • 详解pytest+Allure搭建方法以及生成报告常用操作

    详解pytest+Allure搭建方法以及生成报告常用操作

    本文主要介绍了详解pytest+Allure搭建方法以及生成报告常用操作,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python使用scipy保存图片的一些注意点

    Python使用scipy保存图片的一些注意点

    这篇文章主要介绍了Python使用scipy保存图片的一些注意点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python中f‘{}‘用法小结

    python中f‘{}‘用法小结

    这篇文章主要介绍了python中f‘{}‘用法,f’{}’用法等同于 format用法的简单使用,更加方便,本文给大家详细讲解,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 详解Python描述符的工作原理

    详解Python描述符的工作原理

    在 Python 开发中,你可能听说过「描述符」这个概念,由于我们很少直接使用它,所以大部分开发人员并不了解它的原理. 但作为熟练使用 Python,想要进阶的你,建议还是了解一下描述符的原理,这也便于你更深层次地理解 Python 的设计思想,需要的朋友可以参考下
    2021-06-06
  • python生成特定分布数的实例

    python生成特定分布数的实例

    今天小编就为大家分享一篇python生成特定分布数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例

    Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例

    这篇文章主要介绍了Python 实现 3 种回归模型(Linear Regression,Lasso,Ridge)的示例,帮助大家更好的进行机器学习,感兴趣的朋友可以了解下
    2020-10-10
  • Python基本知识之datetime模块详解

    Python基本知识之datetime模块详解

    这篇文章主要给大家介绍了关于Python基本知识之datetime模块的相关资料,Python内置的时间模块datetime包含下面的模块包含六个类和两个常数,提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求,需要的朋友可以参考下
    2023-08-08
  • Python制作豆瓣图片的爬虫

    Python制作豆瓣图片的爬虫

    本文给大家分享的是作者制作的爬取豆瓣首页图片的爬虫代码,代码很简单,大家可以参考下思路,希望可以帮到大家
    2017-12-12
  • python+POP3实现批量下载邮件附件

    python+POP3实现批量下载邮件附件

    这篇文章主要为大家详细介绍了python+POP3实现批量下载邮件附件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论