使用"作为"

时间:2018-03-30 20:57:46

标签: python python-3.x python-import

首先让我确定一下工作场景。

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

main.py

import module.file1
print(module.file1)

模块/ file1.py

import module.file2

模块/ 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)

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

2 个答案:

答案 0 :(得分:2)

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

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

它适用于import module.file1情况,因为file1未绑定到本地名称空间而且不需要查找。

在您的代码生命周期中,循环导入存在许多陷阱。祝你好运!

答案 1 :(得分:1)

&#34;进口&#34;是一个可执行语句,因此您可以在函数

中进行导入
def test():
    import module.file1
    print(module.file1)