一、    基本概念

动态可执行,是指在代码中通过外部输入或代码嵌入的常量字符串包含代码的方式提供Python代码,要求Python执行这些代码。这样就可以达到开放式运行的效果,提高程序的能力和灵活性。

动态可执行的方法带来方便和灵活性的同时,其实还是带来了安全性威胁。安全性威胁体现在两个方面:

1、    动态执行的代码可能改变原有代码的运行环境,导致出现异常的数据和执行结果。这个威胁可以通过名字空间(namespace)解决;

2、    动态执行代码本身带有攻击性,如文件的改变等。这个本节的动态可执行方法没有好的办法解决,最好的办法是控制输入的数据只允许特定的字符串出现。后续有可以解决的办法,等研究学习后再补充。

二、    关于名字空间

名字空间这个概念在函数介绍的章节做了一些介绍,本节再系统的介绍一下。名字空间(namespace)又被称为命名空间,实际上是一个代码访问的作用域,该空间内存放着相关的变量,不同名字空间的变量相互之间是隔离的,这种隔离确保同样名称的变量对应不同的数据,这样各个代码操作时只能影响自己操作空间的变量,不会影响没有操作空间的变量。

名字空间在Python内部是基于字典实现,键为变量名,值是变量对应的值,因此是名称到对象的映射。具体可见介绍compile方法时的例子。

Python的名字空间有三类:

1、Local(局部名字空间):每个函数所拥有的名字空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数每次递归调用都拥有自己的局部名字空间);

2、Global(全局名字空间):在模块被加载时创建,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。通常一直保留直到python解释器退出;

3、Built-in(内建名字空间):自带的内建名字空间,任何模块均可以访问,放着内置的函数和异常。在python解释器启动时创建,一直保留直到解释器退出。

Python程序执行期间会有2个以上活动的名字空间。三种名字空间的存续周期及顺序如下:

创建顺序:python解释器启动 ->创建内建名字空间 -> 加载模块 -> 创建全局名字空间 ->函数被调用 ->创建局部名字空间。

销毁顺序:函数调用结束 -> 销毁函数对应的局部名字空间 -> python虚拟机(解释器)退出 ->销毁全局名字空间 ->销毁内建命名空。

三、    语法分析与抽象语法树

1.    在计算机科学和语言学中,语法分析(英语:syntactic analysis,也叫parsing)是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程;

2.    语法分析器(parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入;

3.    抽象语法树(Abstract Syntax Trees,AST)其实是源代码的抽象语法结构的树状表现形式,在源代码的翻译和编译过程中,语法分析器创建出分析树;

4.    Python的AST支持:

1)    ast 模块帮助 Python 程序处理 Python 语法的抽象语法树;

2)    抽象语法树可通过将 ast.PyCF_ONLY_AST 传递给 compile() 内置函数来生成,或是使用此模块中提供的 parse() 辅助函数。返回结果将是一个对象树,其中的类都继承自 ast.AST。抽象语法树可被内置的 compile()函数编译为一个 Python 代码对象。

抽象语法树大家感兴趣可以参阅:https://zhuanlan.zhihu.com/p/26988179,虽然是介绍的JavaScript,但Python本质上也是一样的。

本节简单介绍了与动态执行相关的概念、请大家先理解,等本章内容全部学习完成后再回头回顾一下本节内容加深理解。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第6.2节 Python特色的动态可执行方法简介的更多相关文章

  1. 第6章 Python中的动态可执行方法目录

    第6.1节 Python代码编译 第6.2节 Python特色的动态可执行方法简介 第6.3节 Python动态执行之动态编译的compile函数 第6.4节 Python动态表达式计算:eval函数 ...

  2. 第6章 Python中的动态可执行方法 第6.1节 Python代码编译

    在介绍动态可执行方法前,本节先介绍一下Python代码编译有关的知识,因为部分内容和动态执行有些关联. 一.    Python解释器的功能 Python虽然是解释型语言,但Python代码也是可编译 ...

  3. 第8.20节 Python中限制动态定义实例属性的白名单:__slots__

    一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...

  4. 第7.8节 Python中隐秘的类封装方法

    前面章节已经介绍了Python中的多态和继承,本节将介绍面向对象程序设计OOP三大特征的另一个特征--封装. 一.    概念 封装是将对象的状态信息(也就是数据.属性)隐藏在对象内部,将对象的属性和 ...

  5. 第8.18节 Python类中内置析构方法__del__

    一. 引言 基本上所有支持OOP设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...

  6. 第8.16节 Python重写自定义类的__str__方法

    一. 引言 上节结合案例介绍了重写__repr__方法的关注点,重写__repr__方法的要点是要准确的输出开发人员关注的信息,并便于开发人员使用相关信息.而__str__方法是为最终用户返回类的相关 ...

  7. 第8.15节 Python重写自定义类的__repr__方法

    一. 引言 前面两节分别介绍了Python类中的__str__和__repr__方法的作用和语法,所有新式类都支持这两个方法,因为object类实现了这两个方法,但实际上各位开发者在自定义类的过程中, ...

  8. 第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用

    一. 引言 在<第8.13节 Python类中内置方法__repr__详解>老猿介绍了在命令行方式直接输入"对象"就可以调用repr内置函数或__repr__方法查看对 ...

  9. 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型

    Python是一种多态语言,其表现特征是:对象方法的调用方只管方法是否可调用,不管对象是什么类型,从而屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化. 一.    P ...

随机推荐

  1. Codeforces 1404 D. Game of Pairs

    Codeforces 1404 D.Game of Pairs 给定\(2n\)个数\(1,2,...,2n\),A 和 B 将进行交互,规则如下: A 需要将元素分成 n 组 \(\mathbf{p ...

  2. wcf调用时时间参数问题,返回值中有日期格式得值得问题

    第一种情况,客户端在调用wcf后台服务时,参数对象有日期类型得属性,日期默认值不能是datetime.minvalue得值,需要设置大于1971-1-1,不然调不通服务, 第二种情况,服务连通了,并且 ...

  3. Hadoop2.6伪分布式按照官网指点安装(1)

    参考:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.html 照抄:安装成功 ...

  4. linux netfilter nat2

    linux netfilter nat1 后面在上传

  5. intelx86为何从0xFFFF0处执行

    第一条指令的地址 在用户按下计算机电源开关之后,CPU会自动的将其CS寄存器设定为0xFFFF,将其IP寄存器设定为0x0000.由于CS:IP指出了下一条指令的地址[1],因此CPU会跳到0xFFF ...

  6. menuconfig

    1. menuconfig 的存在意义 原由是 项目的 config 项太多了,需要一个人性化的方式设置. menuconfig 背后是一个应用程序,用户和该应用程序交互,完成 config 设置. ...

  7. <连接器和加载器>——概述连接器和加载器

    0.涉及术语 (1)地址绑定 将抽象的符号与更抽象的符号绑定,如 sqrt 符号与地址 0x0020010绑定. (2)符号解析 程序相互作用通过符号进行,如主程序调用库函数sqrt,连接器通过表明分 ...

  8. NO.A.0009——day04——idea的安装及配置教程

    概述: 集成开发环境:IDE.开发工具Integrated Development Environment,IDE, 1.如果自己手洗衣服: 1. 准备一盆水 2. 放入衣服浸泡30分钟 3. 搓洗衣 ...

  9. ImportError: No module named 'chardet'

    1.使用requsets出现这个错误,ImportError: No module named 'chardet' 原因:requests依赖其他一些模块 解决:依次使用pip安装即可 pip ins ...

  10. 讲武德,你们要的高性能日志工具 Log4j2,来了

    Log4j 介绍过了,SLF4J 介绍过了,Logback 也介绍过了,你以为日志系列的文章就到此终结了? 不不不,我告诉你,还有一个 Log4j 2,顾名思义,它就是 Log4j 的升级版,就好像手 ...