您的位置:首页 > 编程语言 > Python开发

Python的执行模型(Execution Model)

2016-12-01 05:29 155 查看
这篇文章是对Python官方文档Execution model的提炼,在需要精确表述的地方附有英文原文。

什么是块(block)?

一个Python程序是由代码块(code block)构建而来的。一个块(block)就是一处Python程序文本,这处文本执行的时候被当做一个单元(unit)一起处理。有哪些程序文本是块(block)呢?它们包括模板(module),函数体(function body),类定义(class definition),交互输入的每一个命令(Each command typed interactively),脚本文件(作为解释器的标准输入或是被指定为解释器的命令行参数的文件),脚本命令(在解释器命令行用
-c
选项指定的命令),传递给内置函数
eval()
exec()
的字符串参数。

命名和绑定

名字的绑定

名字指向对象(objects)。名字通过名字绑定操作被引入。

有哪些构造绑定名字呢?它们包括:

函数的形式参数(formal parameters to functions)

import
语句

类定义

函数定义

被赋值的目标标识符(identifiers)

for
循环头部

with
语句或
except
分句中“as“后面的标识符

其中4和5两种形式将类名或函数名绑定到定义的块中。

如果一个变量在一个块内绑定,它就是一个本地变量。除非被
global
nonlocal
声明。如果一个名字在模块级别绑定,它就是一个全局变(模块代码块的变量既是全局的,又是本地的)。如果一个变量在代码块中使用但是没有在这个代码块中定义,那么这个变量就被称为自由变量(free variable)。

名字的解析

域(scope)定义了块内名字的可见范围(visibility)。一个本地变量(local variable)在一个块内定义,它的域(scope)就包括那个块。如果定义出现在函数块(function block)内,它的域会延伸到该函数块包含的所有块,除非内嵌块中为该名字引入的不同的绑定。

一个名字在代码块中出现时会用最近封闭域(the nearest enclosing scope)来解析。所有对代码块可见的这样的域的集合被称为块的环境。

当一个名字没被找到的时候
NameError
异常被提起,在函数块中出现类似的的情况有可能提起
UnboundLocalError
UnboundLocalError
NameError
的一个子类。

如果一个名字绑定操作出现在一个块内,那么此块内的对该名字的使用都被视为对当前块的引用。这种情况下,名字使用不能出现在绑定操作前。

如果
global
语句出现在块内,所有对该语句中定义的名字的使用指向顶层名字空间中该名字的绑定。名字在顶层(top-level namespace)名字空间中被解析,解析通过查找全局(global namespace)名字空间或内置(builtins)名字空间完成。首先被查找的是全局名字空间,如果没找到,接着查找内置名字空间。
global
语句位于所有对该名使用之前。在同样的块里
global
语句有和名字绑定操作一样的域。如果一个自由变量(free variable)的最近封闭域中包含相关的
global
语句,那么这个自由变量会被当做全局变量。

nonlocal
语句引起对应的名字指向先前在最近封闭函数域中绑定的变量。如果给定的名字没有出现在任何封闭函数域,
SyntaxError
会在编译时被提起。

当一个模块第一次被导入时,它的名字空间自动被创建。

在名字解析中,类定义以及
eval()
exec()
的参数比较特殊。类定义是一个可执行语句,它可能涉及使用和定义名字。引用遵循名字解析的常规规则除了未绑定的本地变量在全局空间中查询。类定义的名字空间变成类的属性字典。定义在类块中的名字的域仅限于该类块,它不会延伸到方法(method)的代码块–这里包括了(comprehension )推导式和生成器表达式(generator expression)。

自由变量在运行时而不是编译时被解析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python
相关文章推荐