1、问题

循环导入,代码如下:

from c import c
def b():
print('b')

b.py

from b import b

def a():
# from b import b
print('a')
b()

a.py

from a import a

def c():
print('c')
a()

c.py

from c import c
from a import a
from b import b c()
b()
a()

start.py

然后执行start.py,发现报错

Traceback (most recent call last):
File "/home/felix/PycharmProjects/DRF/test/u.py", line 5, in <module>
from c import c
File "/home/felix/PycharmProjects/DRF/test/c.py", line 8, in <module>
from a import a
File "/home/felix/PycharmProjects/DRF/test/a.py", line 16, in <module>
from b import b
File "/home/felix/PycharmProjects/DRF/test/b.py", line 8, in <module>
from c import c
ImportError: cannot import name 'c'

原因分析:因为a导入b,b导入c,c导入a的时候,都还没有执行到函数定义的代码,所以找不到模块。

2、解决方法一:

改用导入包的方式,不用导入具体函数的方式

import b

def a():
print('a')
b.b()

a.py

import c

def b():
print('b')

b.py

import a

def c():
print('c')
a.a()

c.py

from c import c
from a import a
from b import b c()
b()
a()

u.py

3、解决方法二:

在函数内导入,不在全局导入

def a():
print('a')
from b import b
b()

a.py

import c

def b():
print('b')

b.py

def c():
print('c')
from a import a
a()

c.py

from c import c
from a import a
from b import b c()
b()
a()

u.py

4、解决方案三:

重构代码,合并

def b():
print('b') def a():
print('a')
b() def c():
print('c')
from a import a
a()

abc_combine.py

from abc_combine import a, b, c

c()
b()
a()

u.py

循环导入问题的解决方案有三种,推荐方案三重构代码,如果实在不想重构代码,建议方案二。

python循环导入的问题的更多相关文章

  1. python循环导入的解决方案

    解决循环import的方法主要有几种:   1.延迟导入(lazy import)   即把import语句写在方法或函数里面,将它的作用域限制在局部. 这种方法的缺点就是会有性能问题.     2. ...

  2. python-模块入门二(模块循环导入,区分python文件的两种用途,模块搜索路径,软件开发的目录规范)

    一.模块的循环导入问题 run.py # import m1 # 第一次导入 m1.py # 错误示范 ''' print('正在导入m1') from m2 import y #第一次导入m2 x= ...

  3. 模块的四种形式、 import和from...import、 循环导入问题、模块的搜索路径、 python文件的两种用途

    目录 模块的四种形式 模块 模块的四种形式 import和from...import 循环导入问题 模拟问题的发生: 解决方案 模块的搜索路径 Python文件的两种用途 模块的四种形式 Nike推荐 ...

  4. python 包以及循环导入

    包的认识 包通过文件夹来管理一系列功能相近的模块 包:一系列模块的集合体重点:包中一定有一个专门用来管理包中所有模块的文件包名:存放一系列模块的文件夹名字包名(包对象)存放的是管理模块的那个文件的地址 ...

  5. python—day15 包的认识、执行顺序、执行流程、循环导入、包的导入、绝对、相对导入

    一.包的认识   包通过文件夹来管理一系列功能相近的模块 ​ 包:一系列模块的集合体 重点:包中一定有一个专门用来管理包中所有模块的文件 包名:存放一系列模块的文件夹名字 包名(包对象)存放的是管理模 ...

  6. Python的循环导入问题

    循环导入的最好的解决方法是从架构上优化,即调整模块和模块成员变量的设计.一个好的原则是:可导出的成员变量,都不应该依赖于导入进来的成员变量. 但是在业务开发的过程中,总会遇到通过架构层面解决不了的导入 ...

  7. Python 1-2模块的循环导入问题

    run.py文件: import m1 # 第一次导入 # 验证解决方案一: ''' 正在导入m1 正在导入m2 ''' # print(m1.x) # print(m1.y) # 验证解决方案二: ...

  8. python 循环语句 函数 模块

    python循环语句 while循环语法结构 当需要语句不断的重复执行时,可以使用while循环 while expression: while_suite 语句ehile_suite会被连续不断的循 ...

  9. 20181205(模块循环导入解决方案,json&pickle模块,time,date,random介绍)

    一.补充内容 循环导入 解决方案: 1.将导入的语句挪到后面. ​ 2.将导入语句放入函数,函数在定义阶段不运行 #m1.pyprint('正在导入m1')   #②能够正常打印from m2 imp ...

随机推荐

  1. 【统计与建模】R语言基本操作

    # vec <- rep( seq(1,5,by=0.5),3) # vec <- seq( 1 , 10 , by = 1 ) # min(vec) #最小值 # max(vec) #最 ...

  2. Z算法板子

    给定一个串$s$, $Z$算法可以$O(n)$时间求出一个$z$数组 $z_i$表示$s[i...n]$与$s$的前缀匹配的最长长度, 下标从$0$开始 void init(char *s, int ...

  3. Comet OJ Contest 4

    A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 ...

  4. winform 替换word文档中的字段(包含图片添加),生成导出PDF文件(也可是word文件)

    1.先打开你需要替换的word文档,在想要后续更换字段值的地方添加“书签”. 2.将模板文档存放在 程序的Debug文件下. 3.生成文件的按钮点击事件 代码: string templatePath ...

  5. [JZOJ5281]钦点题解--瞎搞+链表

    [JZOJ5281]钦点题解--瞎搞+链表 题目链接 于 暴 力 过

  6. kvm第二章--虚拟机管理

  7. stm32 触摸屏 XPT2046

    引脚功能描述 控制字的控制位命令 控制字节各位描述 单端模式输入配置 差分模式输入配置 时序 前8个时钟用来通过DIN引脚输入控制字节,接着的12个时钟周期将完成真正的模数转换,剩下的3个多时钟周期将 ...

  8. 制作win10系统及安装win10系统

    制作win10系统 1.登陆msdn,下载win10系统,打开迅雷下载器,复制完该段代码,直接开始下载,网址:https://msdn.itellyou.cn/ 2.下载软碟通,下载网址:https: ...

  9. mysql limit和offset用法

    limit和offset用法 mysql里分页一般用limit来实现 1. select* from article LIMIT 1,3 2.select * from article LIMIT 3 ...

  10. 【leetcode】338 .Counting Bits

    原题 Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate t ...