使用“ as”时,Python循环引用导入不起作用

保罗·巴顿

首先让我确定什么工作方案。

main.py
module/file1.py
module/file2.py

main.py

import module.file1
print(module.file1)

模块/文件1.py

import module.file2

module / file2.py

import module.file1

跑步python3 main.py给我以下内容,这很好。

<module 'module.file1' from '/project/module/file1.py'>

现在,如果我将module / file2.py更改为以下内容:

import module.file1 as testtt

我得到这个新的输出(错误):

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import module.file1
  File "/project/module/file1.py", line 1, in <module>
    import module.file2
  File "/project/module/file2.py", line 2, in <module>
    import module.file1 as testtt
AttributeError: module 'module' has no attribute 'file2'

我猜想python在简单导入时并不能完全评估导入的模块,仅当在两个文件中的任何一个中立即使用它时,循环引用才会爆炸。

我以为如果在函数中使用模块,我也不会收到错误消息,因为在实际调用函数时会对此求值,如下所示:

import module.file1

def test():
    print(module.file1)

这里有什么建议?我应该只是删除循环引用吗?无论如何,似乎代码都有气味(现有的代码库)。

德莱尼

其实现细节。import语句使用该__import__函数完成查找和导入模块的工作,然后将其返回的模块绑定到as testtt变量。

当执行类似的嵌套导入时import module.file1 as testtt__import__返回基本模块(“模块”)。由于导入器仍然需要将“ file1”绑定到本地名称空间,因此它必须在该对象上查找子模块名称“ file1”。由于file1的导入仍在进行中,因此尚未将其绑定到“模块”模块。

在这种import module.file1情况下可以工作,因为file1它没有绑定到本地名称空间,也不需要查找。

循环导入有很多陷阱,它们会困扰您整个代码的生命周期。祝好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用ViewModel时导航不起作用

使用?/ attr时actionMenuTextColor不起作用

在while循环下使用Scanner时Java else if和else不起作用

使用动词时workingdirectory不起作用

使用路由时指令不起作用

使用glOrtho()时gluLookAt()不起作用?

当我尝试使用“ for”循环更改列表的值时,为什么代码不起作用(在此)?

使用Find时SearchDirection不起作用

当我使用for循环遍历我的django表单时不起作用

使用“小于”运算符检查NUL时,for循环字符串迭代不起作用

使用python Blogger API时Status参数不起作用

使用遮罩时“ WithAnimation”不起作用?

使用eax的fasm循环不起作用

使用python的特定索引后的for循环不起作用

使用ajax的多循环不起作用

在jQuery中使用循环不起作用

Python:使用readline时,串行超时不起作用

使用python导入请求模块在OS X上不起作用

使用Bootstrap时不起作用

使用带有 pageScroll 属性的 ngFor 循环时链接不起作用

为什么使用导入/导出时箭头函数不起作用

如果语句在使用 nmap 时不起作用 Python

JavaScript:当我尝试使用 DOM 时,我的 for 循环似乎不起作用

当我将 & 与 if 条件一起使用时,我的 python 代码不起作用;但是当我使用嵌套的 if 循环时它工作正常

使用 GoogleFonts 时 FontWeight 不起作用

.Add() 方法在使用 C# 中的“for”循环构建列表时不起作用

在 for 循环内部使用时,React 延迟导入不起作用

使用 [[ngModel]] 时 patchValue 不起作用

使用 viewBinding 时 SetTheme 不起作用