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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python写入MySQL数据库的三种方式详解

    Python写入MySQL数据库的三种方式详解

    Python 读取数据自动写入 MySQL 数据库,这个需求在工作中是非常普遍的,主要涉及到 python 操作数据库,读写更新等。本文总结了Python写入MySQL数据库的三种方式,需要的可以参考一下
    2022-06-06
  • 关于使用OpenCsv导入大数据量报错的问题

    关于使用OpenCsv导入大数据量报错的问题

    这篇文章主要介绍了使用OpenCsv导入大数据量报错的问题 ,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Python实现批量下载excel表中超链接图片

    Python实现批量下载excel表中超链接图片

    这篇文章主要为大家详细介绍了如何使用Python实现批量下载excel表中超链接图片,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2024-11-11
  • numpy 声明空数组详解

    numpy 声明空数组详解

    今天小编就为大家分享一篇numpy 声明空数组详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • django创建css文件夹的具体方法

    django创建css文件夹的具体方法

    在本文里小编给大家总结的是关于django创建css文件夹的具体方法,对此有需要的朋友们参考下吧。
    2020-07-07
  • Python 列表推导式需要注意的地方

    Python 列表推导式需要注意的地方

    这篇文章主要介绍了Python 列表推导式需要注意的地方,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-10-10
  • 详解Python中 __get__和__getattr__和__getattribute__的区别

    详解Python中 __get__和__getattr__和__getattribute__的区别

    __get__、__getattr__、__getattribute都是访问属性的方法,但作用不太相同,这里我们就来详解Python中 __get__和__getattr__和__getattribute__的区别:
    2016-06-06
  • python的类方法和静态方法

    python的类方法和静态方法

    这篇文章主要介绍了python的类方法和静态方法,以实例形式分析了Python中类方法和静态方法的实现技巧与应用方法,需要的朋友可以参考下
    2014-12-12
  • 详解python的集合set的函数

    详解python的集合set的函数

    这篇文章主要为大家介绍了python的集合set的函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • python实现的分析并统计nginx日志数据功能示例

    python实现的分析并统计nginx日志数据功能示例

    这篇文章主要介绍了python实现的分析并统计nginx日志数据功能,结合实例形式分析了Python针对nginx日志ip、访问url、状态等数据的相关读取、解析操作技巧,需要的朋友可以参考下
    2019-12-12

最新评论