栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

导入错误。循环参考

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

导入错误。循环参考

循环进口实际上似乎是一个问题。

您的moduleB说“ from moduleA import bar”,它试图加载moduleA,但是它在moduleA中遇到的第一件事是“ from
moduleB import foo”,它将其发送回moduleB。因此,那里有一个无法解决的循环递归。

通常(但并非总是如此),循环导入是您需要重新考虑或重新设计操作方式的一种指标。但是,这里有一些可能的解决方法。

一种是将import语句移到python文件的底部(假设您在另一个函数内部使用foo或bar,因此在加载文件时不会立即调用它)

例如

#ModuleB.py class Bar(object):     def __init__(self):    self.foo = Foo()    self.val = 10    .    .# at bottom of filefrom moduleA import Foo

另一种选择是将import语句放在一个函数内,该函数称为“惰性导入”模式:

#ModuleB.py class Bar(object):     def __init__(self):    from moduleA import Foo    self.foo = Foo()    self.val = 10

关于您的

__init__.py
文件问题。我认为没有理由不让他们为空。空
__init__.py
文件只是告诉python“此目录是python包”,并允许导入。

通常,您的软件包目录中会有一个文件,该文件通过导入和利用子软件包中的模块来“运行”程序。因此,假设存在此类文件(例如package /
main.py),则您的导入将类似于以下内容,只是空

__init__.py
文件。

#package/main.pyfrom subpackage1.moduleA import bar  # you can now call bar() directlyfrom subpackage1 import moduleB  # you can now call foo like: moduleB.foo()from subpackage2.moduleX import jah

您在上面所做的基本上是获取每个子包中所有模块的所有功能和属性,并使它们直接在子包中可用,就好像它们是子包的功能和属性一样(因此您可以

importsubpackage1
调用
subpackage1.bar()
subpackage.foo()

而不是
subpackage.moduleA.bar()
等) ),但我没有得到您必须尝试做的印象,在这种情况下,可能没有理由这样做。

如果需要在subpackage1的模块中的subpackage2中使用某些东西,请参见此问题的答案。 或谷歌如何添加目录到您的Python路径。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/652784.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号