一、    基本概念

动态可执行,是指在代码中通过外部输入或代码嵌入的常量字符串包含代码的方式提供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. 鸿蒙之后,小米 Vela 也来了,下一代物联网平台应该是什么?

    1. 华为鸿蒙基于jerryscript构建物联网应用框架 2020年9月10日 鸿蒙OS 1.0 正式版发布,面向物联网领域,鸿蒙推出了类web开发架构ACE JS = LiteOS + jerry ...

  2. 小规模DES手写加解密

    1.加密 2.解密

  3. 【笔记】nrf52832广播使用--厂商自定义数据应用

    需求: 1)使用蓝牙不停发送ble广播,发送自定义的数据,并每一秒更新自定义数据. 2)设置不同的发射功率.广播间隔.广播名称 1.初始化 使用nordic官方sdk17版本,打开一个ble串口用例. ...

  4. linux常用命令-查看cpu、内存、磁盘和目录空间

    1. 查看磁盘空间: df -h Filesystem      Size  Used Avail Use% Mounted on /dev/xvda1       40G  4.5G   33G   ...

  5. 在Docker上部署自动更新ssl证书的nginx + .NET CORE

    突发奇想要搞一个ssl的服务器,然后我就打起了docker的主意,想着能不能搞一个基于Docker的服务器,这样维护起来也方便一点. 设想 想法是满足这么几点: .NET CORE on Docker ...

  6. linux tcp/ip 参数解析

    后面整理相关信息/* *     TCP option lengths */#define TCPOLEN_MSS            4 //只能出现在SYN段中#define TCPOLEN_W ...

  7. linux netfilter rule match target 数据结构

    对于netfilter 可以参考 https://netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-3.html netfilter ...

  8. C/C++宏替换详解

    目录 1. 基本形式 2. 宏展开中的陷阱 3. #undef 4. 宏参数.# 和 ## 1. 基本形式 #define name replacement_text 通常情况下,#define 指令 ...

  9. Proftp最简匿名访问配置

    前言 每一次做ftp的配置都要弄半天,找文档,各种权限控制的坑,折腾半天,这次还是准备记录下来,以备不时之需,这里不配置什么高级的功能,就去实现一个最简单的配置 匿名用户的上传和下载 配置proftp ...

  10. 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片

    目录 第一部分:Consul 基础 1,Consul 介绍 2,安装 Consul Ubuntu/Debian 系统 Centos/RHEL 系统 检查安装 3,运行 Consul Agent 启动 ...