Python的执行模型(Execution Model)
2016-12-01 05:29
155 查看
这篇文章是对Python官方文档Execution model的提炼,在需要精确表述的地方附有英文原文。
有哪些构造绑定名字呢?它们包括:
函数的形式参数(formal parameters to functions)
类定义
函数定义
被赋值的目标标识符(identifiers)
其中4和5两种形式将类名或函数名绑定到定义的块中。
如果一个变量在一个块内绑定,它就是一个本地变量。除非被
一个名字在代码块中出现时会用最近封闭域(the nearest enclosing scope)来解析。所有对代码块可见的这样的域的集合被称为块的环境。
当一个名字没被找到的时候
如果一个名字绑定操作出现在一个块内,那么此块内的对该名字的使用都被视为对当前块的引用。这种情况下,名字使用不能出现在绑定操作前。
如果
当一个模块第一次被导入时,它的名字空间自动被创建。
在名字解析中,类定义以及
自由变量在运行时而不是编译时被解析。
什么是块(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)。
自由变量在运行时而不是编译时被解析。
相关文章推荐
- JavaScript对象模型-执行模型--摘自http://www.cnblogs.com/RicCC/archive/2008/02/15/javascript-object-model-execution-model.html
- python-django 模型model字段类型说明
- python-recsys 3 Data model 3 数据模型
- python进阶之多线程(进程)同步执行的消费者与生产者模型
- Python核心概念之数据模型和执行模型
- Sharepoin学习笔记—架构系列-- Sharepoint的处理(Process)与执行模型(Trust Model) 2
- How to Save an ARIMA Time Series Forecasting Model in Python (如何在Python中保存ARIMA时间序列预测模型)
- python例子-Django之模型(Model_数据库)
- caffe的python接口学习:用训练好的模型(caffemodel或者h5)来分类新的图片
- JavaScript对象模型(http://www.cnblogs.com/RicCC/archive/2008/02/15/javascript-object-model-execution-model.html)
- SharePoint 【架构系列】-- SharePoint的处理(Process)与执行模型(Trust Model) 01
- 解决:crontab执行python no model name xxx问题
- python-django 模型model字段类型说明
- SharePoint 【架构系列】-- SharePoint的处理(Process)与执行模型(Trust Model) 02
- python-django 模型model字段类型说明
- 定时执行Python脚本或模型
- python后台架构Django教程——数据模型Model
- pythonWeb -- Django开发- 模型Model 和 数据库的操作
- Sharepoin学习笔记 —架构系列-- Sharepoint的处理(Process)与执行模型(Trust Model) 1
- caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片