gpt4 book ai didi

导入模块的 Python 作用域和命名空间

转载 作者:行者123 更新时间:2023-12-01 09:11:36 24 4
gpt4 key购买 nike

我对 Python 中如何确定范围和命名空间感到困惑。假设我有一个文件系统如下:

|-test1.py
-test2.py

各文件定义如下:

测试1.py:

#!/usr/bin/python
def test1():
print('test1')

测试2.py:

#!/usr/bin/python
from test1 import test1
def test2():
test1()
print('test2')

在 python 交互式解释器中,如果我执行以下操作:

import test2
test2.test2()

,代码可以正常运行并给出以下结果:

test1
test2

从输出中我们可以看到解释器可以正确识别test1()函数对象。让我困惑的是在执行过程中导入 test1.test1 时?当这个对象进入全局范围时?

根据@Ziyad Edher的回答,我创建了一个维恩图来说明不同范围的关系。假设解释器被第三个文件 test3.py 替换。它们的作用域如下: 圆圈代表作用域,File test3 指的是 test3.pyFile test2 指的是 test2.pytest2()引用了test2.py中的函数test2()test1( )指的是test1.py中的函数test1()test2() 的作用域没有 test1(),因此解释器将引用上层作用域 File test2。作用域 File test2 具有 test1(),并调用它。

enter image description here

最佳答案

Python 模块导入和全局命名空间管理是一个非常广泛的主题,因此我将把这个答案限制在您所看到的具体情况。

一般来说,Python 的工作方式非常顺序。

  1. 您打开解释器,某些特殊值(例如环境变量和其他内核变量)将被注入(inject)到全局命名空间中。
  2. 您执行import test2,这将转到本地目录中的test2.py文件,并在同一Python环境中执行该文件。
  3. 在执行 test2.py 时,Python 遇到 from test1 import test1
  4. 与步骤 2 类似,Python 会找到 test1.py,它会执行一些额外的操作,因为您要导入模块中的函数而不是模块本身,但一般来说,此时, test1(函数)被放置在当前作用域中。
  5. 您调用 test2.test2(),因为 test2 已在步骤 2 中导入,因此它存在,test2.test2 也存在。因此,解释器跳转到 test2.test2 并调用 test1 ,并且由于它位于命名空间中(我们刚刚在步骤 3 中导入它),因此不会引发错误,然后您的第二次打印调用语句。

在底层,事情显然比这更复杂一些,但这确实给出了 Python 如何处理这些东西的总体概述。

关于导入模块的 Python 作用域和命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51619860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com