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

Quan Zhou

我对如何在Python中确定范围和名称空间感到困惑。假设我的文件系统如下:

|-test1.py
 -test2.py

每个文件的定义如下:

test1.py:

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

test2.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()test2.pytest1()指的是该函数test1()test1.py的范围test2()没有test1(),因此解释器将引用上级范围File test2范围File test2具有test1(),并将其调用。

在此处输入图片说明

齐亚德·埃德(Ziyad Edher)

Python模块导入和全局名称空间管理是一个非常广泛的主题,因此,我将把这个答案限于您看到的特定情况。

通常,Python的工作顺序非常顺畅。

  1. 您打开解释器,某些特殊值(例如环境变量和其他内核变量)被注入到全局名称空间中。
  2. 您执行import test2,这将转到test2.py本地目录中的文件,并在相同的Python环境中执行该文件。
  3. 在执行过程中test2.py,遇到了Python from test1 import test1
  4. 与第2步类似,Python go and findstest1.py会做一些额外的事情,因为您是在模块中而不是模块本身中导入函数,但是一般而言,此时,test1(函数)被置于当前作用域中。
  5. 您调用test2.test2(),因为test2已经在步骤2中导入了它,所以它也存在test2.test2因此,解释器跳至test2.test2并被test1调用,由于它在名称空间中(我们在步骤3中将其导入),因此不会引发任何错误,因此将调用第二个print语句。

在底层,事情显然比这复杂一些,但这确实提供了Python如何处理这些内容的一般概述。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python 中的命名空间和作用域

建立API结构后,模块成员的作用域将变为错误的名称空间

包,名称空间和模块

带有子模块导入的名称空间

在python中导入模块后如何获取模块的完整名称空间

Python名称空间和导入:在导入的模块中设置全局变量的值会创建另一个不相关的全局变量吗?

Python:变量在模块和名称空间之间共享

导入名称空间和子模块都有不利之处吗?例如import React,{Component} from ...

Python将所有内容从多个文件模块导入到名称空间

子模块的python导入路径(如果放在名称空间包中)

命名空间和类之间的作用域

导入模块名称的使用与导入模块的名称空间有何关系?

python导入模块全局本地命名空间

模块过程的名称与包含的作用域单元中的名称冲突

使用 TypeScript 和 Yarn 导入“命名空间/模块”和导入“@命名空间/模块”之间的区别?

如何在iPython中从名称空间隐藏导入的模块?

如何在XQuery中导入公共模块名称空间

在语法错误的名称空间下导入模块?

JavaScript模块-动态导入和副作用

Python:导入模块和库

小胡子模板名称空间冲突/作用域

获取正在导入模块的 python 脚本的名称

没有在Python中导入的情况下,如何在全局名称空间中使用内置模块的内容?

名称空间'/'没有在JUNIT中为作用域“请求”注册的作用域

如何从ES6模块导入默认名称和名称

python-为什么多线程和不同功能/作用域共享单个导入过程

打字稿:库文件中的名称空间和类名称相同时,导入名称空间

如何判断Python模块是否是名称空间模块

Python和冲突的模块名称