Python的执行模型(Execution Model)
来源:互联网 发布:matalab y引入数据 编辑:程序博客网 时间:2024/05/01 05:50
这篇文章是对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的执行模型(Execution Model)
- 1.3. 执行模型 Execution Model
- Python concurent Execution(Python 并发执行)
- SPID Execution Model
- The CLR’s Execution Model
- The CLR’s Execution Model
- Play application's execution model.
- Parallel Execution(并行执行)
- CLR的执行模型
- nginx的执行模型
- CLR的执行模型
- Openlaszlo的css2 model模型的支持
- thinkphp的model模型的设计经验总结
- thinkphp的model模型的设计经验总结
- thinkphp的model模型的设计经验总结
- 浏览器的盒子模型 Box Model
- 主题模型(topic model)的小survey
- Model与UIControl之间的模型关系
- Maximum Product Subarray
- mt5 竖线,连接线 方框
- GCC 符号表小结
- Longest Increasing Subsequence
- Easy 242题 Valid Anagram
- Python的执行模型(Execution Model)
- 大学感悟【六】
- Longest Common Subsequence
- LIN 总线的一些细节
- Easy 438题 Find All Anagrams in a String
- 关于上拉电阻+推挽/开漏
- Learning Python 021 创建文件夹、创建文件
- Learning Python 022 调用DOS命令 --- 实例:调用Windows里面的copy命令
- Linux distribution