专栏首页Python小屋千字14图--Python慎用assert语句阻止代码执行

千字14图--Python慎用assert语句阻止代码执行

过年好,春节快乐!

推荐图书:

《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科课程“Python应用开发”配套教材,清华大学出版社2020年度畅销图书(本书第二版为2019、2020年度畅销图书)

第1章 基础知识/1

1.1 如何选择Python版本

1.2 Python安装与简单使用

1.3 使用pip管理扩展库

1.4 Python基础知识

1.5 Python代码编写规范

1.6 Python文件名

1.7 Python程序的__name__属性

1.8 编写自己的包

1.9 Python快速入门

1.10 The Zen of Python

第2章 Python数据结构/31

2.1 列表

2.2 元组

2.3 字典

2.4 集合

2.5 其他数据结构

第3章 选择与循环/67

3.1 运算符与条件表达式

3.2 选择结构

3.3 循环结构

3.4 break和continue语句

3.5 综合运用

第4章 字符串与正则表达式/83

4.1 字符串

4.2 正则表达式

第5章 函数设计与使用/115

5.1 函数定义

5.2 形参与实参

5.3 参数类型

5.4 return语句

5.5 变量作用域

5.6 lambda表达式

5.7 案例精选

5.8 高级话题

第6章 面向对象程序设计/138

6.1 类的定义与使用

6.2 类的方法

6.3 属性

6.4 特殊方法与运算符重载

6.5 继承机制

第7章 文件操作/158

7.1 文件基本操作

7.2 文本文件基本操作

7.3 二进制文件操作

7.4 文件级操作

7.5 目录操作

7.6 案例精选

第8章 异常处理结构与程序调试/181

8.1 基本概念

8.2 Python异常类与自定义异常

8.3 Python中的异常处理结构

8.4 断言与上下文管理

8.5 使用IDLE调试代码

8.6 使用pdb模块调试程序

第9章 GUI编程/199

9.1 tkinter基础

9.2 tkinter精彩编程

第10章 网络程序设计/230

10.1 计算机网络基础知识

10.2 UDP和TCP编程

10.3 Socket编程案例精选

10.4 网页内容读取与网页爬虫

第11章 安卓平台的Python编程/248

11.1 QPython简介

11.2 安卓应用开发案例

第12章 Windows系统编程/254

12.1 注册表编程

12.2 创建可执行文件

12.3 调用外部程序

12.4 创建窗口

12.5 判断操作系统版本

12.6 系统运维

第13章 多线程与多进程编程/273

13.1 threading模块

13.2 Thread对象

13.3 线程同步技术

13.4 多进程编程

第14章 数据库编程/294

14.1 SQLite应用

14.2 访问其他类型数据库

第15章 多媒体编程/306

15.1 图形编程

15.2 图像编程

15.3 音乐编程

15.4 语音识别

15.5 视频处理和摄像头接口调用

第16章 逆向工程与软件分析/328

16.1 主流项目与插件简介

16.2 IDAPython与Immunity Debugger编程

16.3 Windows平台软件调试原理

16.4 案例精选

第17章 科学计算与可视化/349

17.1 numpy简单应用

17.2 scipy简单应用

17.3 matplotlib简单应用

17.4 数据分析模块pandas

17.5 统计分析模块statistics

第18章 密码学编程/377

18.1 安全哈希算法

18.2 对称密钥密码算法DES和AES

18.3 非对称密钥密码算法RSA与数字签名算法DSA

=======================

问题描述:

很多人习惯在程序中使用assert断言语句来对某些条件进行约束,如果条件不满足就抛出异常,从而强行阻止执行后面的代码。并且,很多资料建议在开发过程中使用assert进行约束,但是要在发布代码之前删除所有的assert语句。这是为啥呢?这样做是否可以呢?

Python程序运行时有个特殊的只读属性__debug__,源码解释运行(包括使用import导入模块)时值为True,这时assert语句起作用,确实可以在特定条件不满足时阻止执行后面的代码。但是,把Python程序源码使用优化模式编译为字节码后运行时,__debug__的值为False,并且在优化编译时会删除所有的assert语句,再也起不到任何的约束和拦截作用,直接执行后面代码时抛出异常。

例如,有源码文件“临时测试专用.py”,内容如下:

执行该程序时报错,最后一条语句被成功拦截,没有执行,如图

接下来,使用标准库py_compile对源码文件进行编译,得到两种优化级别的字节码,如图

切换到命令提示符cmd环境,分别执行源码文件和两个字节码文件,如图

使用pip安装扩展库uncompyle6,然后对上面得到的两个字节码文件进行反编译,得到2个源码,发现其中都没有assert断言语句,并且特殊属性__debug__被替换为固定值False,如图

综上,在Python程序中应慎用assert断言语句来阻止后面代码的执行,尤其是计划发布优化编译的字节码的场合,除非在开发和测试阶段已经考虑到了所有的可能,并且确保可以安全删除assert断言语句而不影响程序执行。

为进一步验证上面的说法,以下面的猜数游戏代码为例,源码如下:

直接运行源码,如图

代码保存为文件“猜数游戏.py”,使用不设置优化级别和设置优化级别两种方式分别编译为2个字节码文件:

切换到命令提示符cmd环境,执行字节码文件:

查看源码文件属性,大小如图所示:

查看字节码文件大小,优化编译的字节码文件比没有设置优化级别得到的字节码文件小一些。

按照本文前面介绍的方法,对得到的优化字节码文件进行反编译,结果如下,可以发现其中不包含源码中的注释,所有assert语句都被删除。

同理,对不设置优化级别得到的字节码进行反编译,查看源码,会发现没有包含源码中的注释(编译时只会删除井号开头的行注释,不会删除三引号内的块注释,请自行验证),但是保留了assert断言语句。另外,不设置优化级别时,字节码运行时__debug__属性值为True,可自行验证。

由此可以验证,优化编译时确实会删除assert语句,从而使得断言无效。同时也可以发现,把Python程序编译为源码发布并不能对源码起到任何保护,可以很容易地反编译得到源码。如果确实想保护源码,可以使用pyinstaller之类的工具打包为二进制可执行文件,虽然也可以通过特殊手段得到源码,但难度要大上很多,本文不介绍这个技术。

本文分享自微信公众号 - Python小屋(Python_xiaowu),作者:董付国

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python运行环境与异常处理

      Doctest模块允许在文档字符串内嵌入注释以显示各种语句的期望行为,尤其是函数和方法的结构;此处的文档字符串看起来如同一个交互式shell会话;可用于测试...

    py3study
  • 调试

    抛出异常相当于是说:“停止运行这个函数中的代码,将程序执行转到 except 语句”。

    py3study
  • 改善Python程序的一些建议

    第一章:引论 建议1、理解Pythonic概念----详见Python中的《Python之禅》 建议2、编写Pythonic代码 (1)避免不规范代码,比如只用...

    企鹅号小编
  • #21 Python异常

    运行程序时经常遇到各种错误,例如:ImportError(导入模块错误)、IndexError(索引错误)、NameError(变量错误)、SyntaxErro...

    py3study
  • 用Python进行单元测试

    Python编程语言,不仅仅在机器学习、数据分析等领域大放异彩,在web开发中等软件开发中,使用者也越来越多。

    老齐
  • 【十五】python之异常处理

    在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!!

    菲宇
  • Python学习手册之Python异常和

    在上一篇文章中,我们介绍了 Python 的函数和模块,现在我们介绍 Python 中的异常和文件。

    py3study
  • 实验六 异常处理实验

    2、掌握raise和assert语句,会抛出自定义的异常,掌握with和as环境安装器的使用。

    背雷管的小青年
  • 为什么你的Python代码质量如此不堪……

    作者:笑虎(Python爱好者,关注爬虫、数据分析、数据挖掘、数据可视化等) 原文链接:http://codebay.cn/post/7953.html

    小小詹同学

扫码关注云+社区

领取腾讯云代金券