广告
返回顶部
首页 > 资讯 > 后端开发 > 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://www.lsjlt.com/news/161720.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python相互导入的问题解决
    目录前言问题→解决问题描述问题复现解决问题总结前言 Hi! 这是随笔专栏的第一篇文章。好的开始等于成功了一半。在之后的日子里,除了不定期分享实战中可总结出的小项目外,还会经...
    99+
    2022-11-12
  • 如何解决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 相对导入与绝对导入,这两个概念是相对于包内导入而言的。包内导入即是包内的模块导入包内部的模块。 Python import 的搜索路径 在当前目录下搜索该模块 在环境变量 P...
    99+
    2022-06-04
    详解 Python
  • 如何解决Mysql导入导出时遇到的问题
    这篇文章给大家分享的是有关如何解决Mysql导入导出时遇到的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景自从把我手上的任务全部转换成docker运行和管理之后,遇到了一...
    99+
    2022-10-18
  • 如何解决Mysql导入乱码问题
    这篇文章主要介绍如何解决Mysql导入乱码问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 解决Mysql导入乱码问题方法一: 通过增加参数 –default-character...
    99+
    2022-10-18
  • python互斥锁问题怎么解决
    在Python中,可以使用互斥锁(Lock)来解决互斥访问问题。互斥锁是一种线程同步的机制,它可以保证在同一时刻只有一个线程能够访问...
    99+
    2023-10-23
    python
  • 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异常
  • 如何解决navicat导入Excel报错的问题
    这篇文章将为大家详细讲解有关如何解决navicat导入Excel报错的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近刚安装完navicat ,准备导入工作数据进去...
    99+
    2022-10-18
  • python中关于py文件之间相互import的问题及解决方法
    目录问题背景实例演示问题背景 调试脚本时,遇到一个问题:ImportError: cannot import name 'A' from 'study_cas...
    99+
    2022-11-13
  • MySQL导入.sql文件方法以及导入失败的问题解决
    首先这是聂老师的sql文件 -- MySQL dump 10.13 Distrib 8.0.27, for Win64 (x86_64)---- Host: localhost Database: teaching-- ------...
    99+
    2023-09-02
    sql mysql 数据库
  • pycharm无法导入包问题如何解决
    如果PyCharm无法导入包,可以尝试以下几种解决方法:1. 确保你已经正确安装了需要导入的包。可以通过在终端中运行`pip ins...
    99+
    2023-09-22
    pycharm
  • Java 互相关联的实体无限递归问题的解决
    目录Java 互相关联的实体无限递归在Jackson2.0以前的解决办法是好好理解Java中的递归递归的思想递归的条件要素递归的算法结构递归实战举例小结一下吧Java 互相关联的实体...
    99+
    2022-11-12
  • Python导包模块报错的问题解决
    Python导包模块报错的问题: import报错No module named "xxx"的问题如何将指定目录作为项目根目录,让项目根目录下的包/模块都可以直接...
    99+
    2022-11-13
  • python中字典和列表的相互嵌套问题详解
    目录1.列表中存储字典:1.列表中存储多个字典2.访问列表中字典的值3.遍历访问多个值2.字典中存储列表1.访问字典中的列表元素2.访问字典中的值(字典中的值为列表)3.字典中存储字...
    99+
    2022-11-12
  • Mysql 导入导出csv 中文乱码问题的解决方法
    导入csv:复制代码 代码如下:load data infile '/test.csv' into table table_name fields terminated by ','...
    99+
    2022-11-15
    Mysql csv 中文乱码
  • 如何解决Vue结合后台导入导出Excel的问题
    这篇文章将为大家详细讲解有关如何解决Vue结合后台导入导出Excel的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。导出Excel功能这里不谈别人怎么实现的,我是从后...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作