Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >循环导入的python解决方案

循环导入的python解决方案
EN

Stack Overflow用户
提问于 2015-07-13 11:41:53
回答 4查看 9K关注 0票数 6

好的,就是这样。

我不想泄露我的代码,但是如果你真的需要,我会的。我有两个模块,彼此需要一点。这些模块称为the处理程序和数据处理程序。

在网络处理程序中,我有一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import datahandler 

在数据处理程序中,我有另一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import webhandler

现在,我知道这是非常糟糕的代码,这样的循环导入会导致代码运行两次(这正是我试图避免的)。

但是,数据处理程序模块需要访问来自webhandler模块的多个函数,而webhandler模块需要访问在数据处理程序模块中生成的多个变量。除了将函数移动到不同的模块之外,我看不到任何其他的解决办法,但这会破坏我的程序的组织,并且对模块命名没有任何逻辑意义。

有什么帮助吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-13 11:51:05

循环依赖是代码嗅觉的一种形式。如果您有两个相互依赖的模块,那么这是一个非常糟糕的迹象,您应该重构您的代码。

有几种不同的方法可以做到这一点;哪一种是最好的取决于您正在做什么,以及每个模块的哪些部分实际上是由另一个模块使用的。

  • 一个非常简单的解决方案是将两个模块合并,所以您只有一个模块,它只依赖于自己,或者更确切地说,取决于它自己的内容。这很简单,但是由于您以前已经分离了模块,所以您可能会以这种方式引入新的问题,因为您不再将关注点分离开来。
  • 另一种解决方案是确保实际需要依赖项。如果一个模块中只有几个部分依赖于另一个模块,也许您可以以不再需要循环依赖的方式移动这些比特,或者利用导入工作的方式使循环依赖不再是一个问题。
  • 更好的解决方案可能是将依赖项移动到单独的新模块中。如果命名确实是最难的问题,那么您可能做得很好。它可能会“破坏你的程序的组织”,但由于你有循环的依赖关系,你的设置有一些固有的错误。
票数 10
EN

Stack Overflow用户

发布于 2015-07-13 12:21:49

其他人所说的不执行循环导入是最好的解决方案,但是如果您最终绝对需要它们(可能是为了向后兼容性或代码的清晰性),它通常在其中一个模块的一个方法或功能中。因此,您可以安全地这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# modA.py
import modB

# modB.py
def functionDependingOnA():
    import modA
    ...

每次调用函数时,执行导入的开销都很小,但是除非一直调用它,否则它是相当低的。(在我的测试中大约有400 in )。

为了避免这种查找,您也可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# modA -- same as above.

# modB.py
_imports = {}

def _importA():
    import modA
    _imports['modA'] = modA
    return modA

def functionDependingOnA():
    modA = _imports.get('modA') or _importA()

该版本只在第二次调用和后续调用上增加了40 as的时间,或者与空的本地函数调用的时间相同。

票数 7
EN

Stack Overflow用户

发布于 2019-10-22 05:16:26

SqlAlchemy使用依赖项注入模式,其中所需的模块由装饰器传递给函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@util.dependencies("sqlalchemy.orm.util")
def identity_key(cls, orm_util, *args, **kwargs):
    return orm_util.identity_key(*args, **kwargs)

这种方法基本上与在函数中执行import相同,但性能稍微好一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31392035

复制
相关文章
Python中的循环(或循环)导入
本文翻译自:Circular (or cyclic) imports in Python
用户7886150
2020/11/30
3.5K0
Python导入循环方法
    实际上,在使用 Python 时, 你会发现是能够导入循环的。 如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。 
党志强
2020/01/23
5630
Python导入循环方法
    实际上,在使用 Python 时, 你会发现是能够导入循环的。 如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。 
py3study
2020/01/06
6170
Python模块的交叉引用(导入循环)问题分析
    首先交叉引用或是相互引用,实际上就是导入循环,关于导入循环的详细说明,可见我摘自《python核心编程》第二版的摘抄:Python导入循环方法。
党志强
2020/02/11
5.5K0
Python: PyCharm中导入matplotlib时报错的解决方案
在使用PyCharm时,在PyCharm的Python Console中 import matplotlib.pyplot as plt时,会出现:
用户7718188
2021/10/08
1.8K0
Python的绝对导入和相对导入
Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的。包内导入即是包内的模块导入包内部的模块。
狼啸风云
2019/11/27
4.5K0
python的循环
编写程序时经常有代码需要重复运行,python提供了while和for进行循环操作。
py3study
2020/01/08
1.5K0
百万数据的导入导出解决方案
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/10/11
2.1K0
百万数据的导入导出解决方案
python如何使用for循环_Python 中for循环的应用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170074.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
7K0
Python - 导入的位置
https://www.cnblogs.com/poloyy/p/12489834.html
小菠萝测试笔记
2021/07/20
6740
Spring中的循环依赖解决方案
循环依赖:循环依赖就是循环引用,就是两个或多个bean互相之间持有对方。比如beanA引用beanB,beanB引用beanA,当我们实例化beanA的时候发现beanB作为beanA的成员对象出现了,那么我们就可能在实例化beanA的中间需要先实例化beanB,然后完成beanB的实例化之后,才能完成beanA的实例化,可惜的是beanB中也引用了beanA,在实例化beanB过程中又需要实例化beanA,而beanA正在进行实例化,但完成beanA的实例化的条件是beanB实例化完成,完成beanB实例化的条件是完成beanA的实例化,于是他们最终反映为一个环状依赖,难以完成实例化。
naget
2019/07/03
2.1K0
python的for循环是什么循环_while循环的用法举例
我们将从一组基本例子和它的语法开始,还将讨论与 for 循环关联的 else 代码块的用处。
全栈程序员站长
2022/09/22
2.3K0
python的for循环是什么循环_while循环的用法举例
记因循环依赖的解决方案
前言 循环依赖分为2类: RPC服务间(dubbo、http)循环依赖 应用间循环依赖 Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,防止Spring初始化完成。这种情况我们就叫做RPC服务间循环依赖。出现了循环依赖,必须有一方先启动。所以这种问题是一定需要解决的。 应用间循环依赖大致情况如下: A应用调用B应用的服务,B应用也会调用A应用的服务,无论是间接调用还是直接调用。 这种循环依赖刚开始不会出现问题 ,但随着代码变更,有可能会发展为RPC服务间循环依赖。 可以通过check=
sanshengshui
2019/11/13
2K0
Python 循环与for循环
循环与for循环 什么是循环 周而复始地运动或变化 遍历 for循环的功能与用法 通过for关键字将列表, 元组, 字符串, 字典中的每个元素按照列顺序进行遍历(循环) 字典的for循环 用法 for item in iterable : # for循环语法块 print(item) # 每次循环对应的代码块 代码块需要缩进 参数 iterable: 一切可循环的数据类型 如列表 元组 字符串 字典 item : iterable中的每一个元素(成员) 返回值 for循环是语句,没有返
Zkeq
2022/05/18
3.2K0
python的while循环和for循环的练习
说明:python divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。
用户7886150
2020/11/09
2.3K0
Python import导入模块 - reload() 导入的内容
模块被导入后,import module不能重新导入模块,重新导入需用reload
Devops海洋的渔夫
2019/06/02
3.1K0
IDEA无法导入依赖时的解决方案
复制以上的依赖代码粘贴到相应的pom.xml文件中,之后通过Maven来自动下载依赖。
萌萌哒的瓤瓤
2020/08/26
3.7K0
IDEA无法导入依赖时的解决方案
Python的for循环,continu
#break+for循环,break只跳出当前小的被嵌套的for循环                 
py3study
2020/01/10
4210
python的while循环
while循环 #!/usr/bin/python #coding:utf-8 i=0 sum=0 while i<=99: i+=1 sum+=i print sum 先运算再求和
py3study
2020/01/08
1.3K0
Python for循环的使用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170051.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
1.2K0

相似问题

Python循环导入:解决方案和最佳实践

15

django循环导入解决方案

111

循环导入Python

11

Python:循环导入

149

Python循环导入

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文