返回顶部
首页 > 资讯 > 后端开发 > Python >Python相互导入的问题解决
  • 864
分享到

Python相互导入的问题解决

2024-04-02 19:04:59 864人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言问题→解决问题描述问题复现解决问题总结前言 Hi! 这是随笔专栏的第一篇文章。好的开始等于成功了一半。在之后的日子里,除了不定期分享实战中可总结出的小项目外,还会经

前言

Hi! 这是随笔专栏的第一篇文章。好的开始等于成功了一半。在之后的日子里,除了不定期分享实战中可总结出的小项目外,还会经常与大分享开发时遇到的问题。今天,是一个曾困扰了我许久的关于 python 两个文件间互相 import 的问题。

问题→解决

问题描述

两个文件间相互导入时产生了一系列错误,比如 ImportError, NameError 等等。这次,我用简单的代码示例复现一下这些问题,并一步一步解决。

问题复现

这里,我创建两个同目录下的 Python 文件:mutualImportA 和 mutualImportB 并输入代码。

# mutualImportA.py  
  
from mutualImportB import b
  
a = 1  
  
  
def pA():  
    print(b)  
  
  
pA()
# mutualImportB.py  
  
from mutualImportA import a  
  
b = 1  
  
  
def pB():  
    print(a)  
  
  
pB()
创建完毕后,任意运行 A 或 B 都会报错:
ImportError: cannot import name 'b' from partially initialized module 'mutualImportB' (most likely due to a circular import)
当然有些人习惯于用 import 的导入而非 from import 的导入方式,这时候的报错就会变成:
AttributeError: partially initialized module 'mutualImportB' has no attribute 'b' (most likely due to a circular import)

好的,这两个报错还算友好。这种导入的方式都在程序出指明了导入的内容,所以解释器可以发现这里是循环导入(most likely due to a circular import)。但有时出现的 NameError 才真正让人头疼。

我们将代码改一下,保留 from import 语句,但将其 import 后面的变量名改为通配符 * 。这次的报错:
NameError: name 'b' is not defined

这就很奇怪了。我们在使用 IDE 时, IDE 不会检出相互导入时引发的循环导入问题。不过前两种在报错中即可看出,而这时,从报错中很难发现为何 b 没有声明。这种专为复现而出现的小文件中问题可以捋清思路、找到问题,在较大的项目中就往往无从下手了。

那么为什么会出现这样的情况呢?我们想一下整个程序的运行流程。

在这里插入图片描述

问题复现完毕,下面探讨如何解决问题。

解决问题

此前,我曾在许多平台看到过文章,但其中绝大部分都是完全重复的(尤其在 CSDN 上),明显互相“转载”来“转载”去。可惜,转载的文章并不能真正解决问题。在这篇原创的文章中,我将自己摸索的经验分享了出来。下面转入正题。

循环导入的根本原因是什么?为什么会循环导入?
其实由循环导入,我们可以想到递归而引发的栈溢出。

def a(b):
    return a(b)
这,是一个明显错误的函数。一旦我们调用了函数,函数内部就会不加判断地再次调用此函数。
而当我们加入了判断时:
def a(b):
	if b == 1:
		return 1
	else:
		return a(b - 1)
这样的话,该函数就转变为一个健康的函数了。

将同样的思路运用到相互导入的方式上。我们必须在整个文件初就要导入某个模块吗?一般来说不是的。我们应当将导入放在它真正被需要的函数里。比如,问题复现中的 a、b 改一下:

# mutualImportA.py  
  
a = 1  
  
  
def pA():  
	from mutualImportB import b
    print(b)  
  
  
pA()
# mutualImportB.py  
  
  
b = 1  
  
  
def pB():  
	from mutualImportA import a  
    print(a)  
  
  
pB()
这样的话,就没有上面的循环导入的问题了。这次再划分下流程:

在这里插入图片描述

OK,那么问题到此为止就解决完毕了。

当然,据此问题也衍生出了一些代码的规范问题:
开发中,若文件较小,还是最好不要将需要相互使用的两个函数或类分到两个文件中。这样,可以避免不少的问题。

总结

说个事情,上一篇博客《利用深度优先搜索等算法实现围棋棋盘控制》有一处打错,应是 GitHub 而非 github ,在此更正一下~

那么今天关于 Python 开发时遇到的问题的分享就到此为止了,再见!

到此这篇关于Python相互导入的问题解决的文章就介绍到这了,更多相关Python相互导入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python相互导入的问题解决

本文链接: https://lsjlt.com/news/161720.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python相互导入的问题解决
    目录前言问题→解决问题描述问题复现解决问题总结前言 Hi! 这是随笔专栏的第一篇文章。好的开始等于成功了一半。在之后的日子里,除了不定期分享实战中可总结出的小项目外,还会经...
    99+
    2024-04-02
  • 如何解决Python相互导入的问题
    本篇文章为大家展示了如何解决Python相互导入的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。问题描述两个文件间相互导入时产生了一系列错误,比如 ImportError, NameError ...
    99+
    2023-06-26
  • vue css相对路径导入问题怎么解决
    本篇内容介绍了“vue css相对路径导入问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前提npm inst...
    99+
    2023-06-30
  • spring怎么解决相互依赖问题
    在Spring中,可以通过以下几种方式解决相互依赖问题:1. 构造函数注入:使用构造函数将依赖项作为参数传递给类的构造函数,从而实现...
    99+
    2023-08-16
    spring
  • flask循环导入的问题解决
    循环导入是指两个文件相互导入对方,形成一个导入循环。这会导致Python无法确定哪个模块应该先导入,进而出现错误。 举个Flask中的例子: 在app.py文件中: from vie...
    99+
    2023-05-18
    flask循环导入
  • springboot的相互依赖报错问题怎么解决
    本篇内容介绍了“springboot的相互依赖报错问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!springboot相互依赖报错...
    99+
    2023-06-29
  • python互斥锁问题怎么解决
    在Python中,可以使用互斥锁(Lock)来解决互斥访问问题。互斥锁是一种线程同步的机制,它可以保证在同一时刻只有一个线程能够访问...
    99+
    2023-10-23
    python
  • 详解Python中的相对导入和绝对导入
    前言 Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的。包内导入即是包内的模块导入包内部的模块。 Python import 的搜索路径 在当前目录下搜索该模块 在环境变量 P...
    99+
    2022-06-04
    详解 Python
  • 如何解决Mysql导入导出时遇到的问题
    这篇文章给大家分享的是有关如何解决Mysql导入导出时遇到的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景自从把我手上的任务全部转换成docker运行和管理之后,遇到了一...
    99+
    2024-04-02
  • python中关于py文件之间相互import的问题及解决方法
    目录问题背景实例演示问题背景 调试脚本时,遇到一个问题:ImportError: cannot import name 'A' from 'study_cas...
    99+
    2024-04-02
  • Java 互相关联的实体无限递归问题的解决
    目录Java 互相关联的实体无限递归在Jackson2.0以前的解决办法是好好理解Java中的递归递归的思想递归的条件要素递归的算法结构递归实战举例小结一下吧Java 互相关联的实体...
    99+
    2024-04-02
  • python中字典和列表的相互嵌套问题详解
    目录1.列表中存储字典:1.列表中存储多个字典2.访问列表中字典的值3.遍历访问多个值2.字典中存储列表1.访问字典中的列表元素2.访问字典中的值(字典中的值为列表)3.字典中存储字...
    99+
    2024-04-02
  • 如何解决Mysql导入乱码问题
    这篇文章主要介绍如何解决Mysql导入乱码问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 解决Mysql导入乱码问题方法一: 通过增加参数 –default-character...
    99+
    2024-04-02
  • 如何解决navicat导入Excel报错的问题
    这篇文章将为大家详细讲解有关如何解决navicat导入Excel报错的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近刚安装完navicat ,准备导入工作数据进去...
    99+
    2024-04-02
  • python使用jpype导入多个Jar的异常问题及解决
    目录使用jpype导入多个Jar的异常python调用jpype 报错OSError JVM is already started和JVM cannot be restarted总结...
    99+
    2022-12-08
    python使用jpype jpype导入Jar异常 jpype导入多个Jar异常
  • 解决Goland 同一个package中函数互相调用的问题
    使用的为 goland 碰到同一个 package 互相调用,编译显示函数未定义, 原因为默认按file 编译,默认没有编译version.go 解决方法 设置按照 package ...
    99+
    2024-04-02
  • vue组件和iframe页面的相互传参问题及解决
    目录vue组件和iframe页面相互传参vue组件调用iframe页面方法和参数iframe页面向vue组件传参内嵌iframe页面并进行传值vue组件和iframe页面相互传参 目...
    99+
    2024-04-02
  • C语言如何解决QString与QByteArray互相转换的问题
    今天小编给大家分享的是C语言如何解决QString与QByteArray互相转换的问题,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录[1] QString与QByteArray互...
    99+
    2023-07-06
  • 如何解决虚拟机无法导出导入的问题
    检查虚拟机是否受损:首先检查虚拟机是否受损或出现错误。可以尝试重新启动虚拟机或使用虚拟机管理软件进行修复。 检查虚拟机配置:确保导出和导入的虚拟机配置是兼容的。如果导出的虚拟机配置与导入的虚拟机配置不匹配,可能会导致导入失败。 使用...
    99+
    2024-06-10
    virtualbox
  • 如何解决虚拟机导出导入失败的问题
    虚拟机导出导入失败可能有多种原因,可以尝试以下方法来解决问题: 确保虚拟机软件版本和格式兼容:导出的虚拟机文件格式需要与导入的虚拟机软件版本兼容,否则可能导致导入失败。建议升级虚拟机软件到最新版本。 检查虚拟机配置:确保导出虚拟机的...
    99+
    2024-06-11
    virtualbox
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作