一、    基本概念

动态可执行,是指在代码中通过外部输入或代码嵌入的常量字符串包含代码的方式提供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. 为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap

    微信搜索「码农田小齐」,关注这个在纽约的程序媛,回复「01-05」可以获取计算机精选书籍.个人刷题笔记.大厂面经.面试资料等资源,么么哒- 首先我们有一个假设:任何两个 object 的 hashCo ...

  2. pc端兼容IE9及以上版本

    最近业务部门反映我们商城的兼容性不是很好,尤其是在IE浏览器上,经过调研,我们决定对IE9及以上版本的IE内核浏览器进行主流程测试,发现有哪些功能在IE9上不兼容 一.CSS兼容性 如下图所示 使用了 ...

  3. SSH个人小结

    初学SSH的一些总结,主要来源于谷歌搜索和鸟叔的教程http://cn.linux.vbird.org/linux_server/0310telnetssh_2.php 以及阮一峰的博客http:// ...

  4. TP5 RCE

    Thinkphp5 RCE 复现 环境: win10+wamp+thinkphp5.1.29 下载地址 源码分析 程序首先跳转到 public目录下的index.php,然后执行 thinkphp/l ...

  5. CSS属性(字体与文本属性)

    1.字体属性 (1)font-family 把要对这个网站要设置的字体都写上,如果这个浏览器支持第一个字体,则会用,如果不支持则会尝试第二个,如果设置的字体系统都不支持则会使用系统默认的字体作为网站的 ...

  6. 使用Java将XSL和XML文件输出为HTML(XSL学习笔记二)

    XSL 指扩展样式表语言(EXtensible Stylesheet Language),前面一篇博客介绍了使用XSL即可直接将XML输出为HTML片段被浏览器解析,但是这样在web应用中浏览器的解析 ...

  7. 真零基础Python开发web

    Python开发web服务的优势是开发效率高,可能只需要java五分之一的代码量. Python搭建web服务有许多框架,本文介绍Django和bottle两个框架. Django 安装 首先,安装该 ...

  8. 痞子衡嵌入式:揭秘i.MXRT600的ISP模式下用J-Link连接后PC总是停在0x1c04a的原因(Debug Mailbox)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT600中的Debug Mailbox实现对JLink调试的影响. 事情缘起痞子衡的同事 - 喜欢打破砂锅问到底的Kerry小 ...

  9. 推荐一款比迅雷下载速度快的mac下载器

    Folx和迅雷是2款支持在Mac系统上进行文件资源下载的工具,两者都支持BT种子资源的下载和直链下载,但Folx还另外支持了下载计划的自定义和智能限速功能.本文主要是为了比较Folx和迅雷在下载同一资 ...

  10. FL Studio录制面板作用介绍

    在上一节教程中我们详细的讲解了一下FL Studio录制面板菜单的一些功能,今天我们将继续讲解该面板的知识.具体内容小编这里就不多说了,还是一起来看看吧! 1.录音倒数.该按钮在打开的情况下会在录音前 ...