Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >千字14图--Python慎用assert语句阻止代码执行

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

作者头像
Python小屋屋主
发布于 2021-03-16 06:37:47
发布于 2021-03-16 06:37:47
8080
举报
文章被收录于专栏:Python小屋Python小屋

过年好,春节快乐!

推荐图书:

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 UDPTCP编程

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之类的工具打包为二进制可执行文件,虽然也可以通过特殊手段得到源码,但难度要大上很多,本文不介绍这个技术。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python批量提取Excel文件中文本框组件里的文本
《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科课程“Python应用开发”配套教材,清华大学出版社2020年度畅销图书(本书第二版为2019、2020年度畅销图书)
Python小屋屋主
2021/03/16
1.8K0
Python批量提取Excel文件中文本框组件里的文本
Python批量查看Windows系统中快捷方式的真实路径
《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科课程“Python应用开发”配套教材,清华大学出版社2020年度畅销图书(本书第二版为2019、2020年度畅销图书)
Python小屋屋主
2021/03/16
1.2K0
Python批量查看Windows系统中快捷方式的真实路径
通过内置对象理解 Python(一)
如果你已经对 Python 有了初步的了解,比如阅读过《Python 大学使用教程》或者《跟老齐学 Python:轻松入门》,亦或者学习过老齐在 CSDN 等平台上发布的在线课程(参考:www.itdiffer.com),再阅读本文,会帮助你更深刻立即 Python 语言的特点,掌握 Python 语言的使用方法。
老齐
2021/11/04
5380
Python使用视频合成技术添加飘动的文本
《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科课程“Python应用开发”配套教材,清华大学出版社2020年度畅销图书(本书第二版为2019、2020年度畅销图书)
Python小屋屋主
2021/03/16
1.2K0
Python使用视频合成技术添加飘动的文本
Python+requests+bs4批量下载公众号PPT
《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科课程“Python应用开发”配套教材,清华大学出版社2020年度畅销图书(本书第二版为2019、2020年度畅销图书)
Python小屋屋主
2021/03/16
8180
Python+requests+bs4批量下载公众号PPT
Python性能优化的幕后功臣: __pycache__与字节码缓存机制
在日常Python开发中,我们经常会看到项目目录下神秘的__pycache__文件夹和.pyc文件。作为经验丰富的Python开发者,今天让我们深入理解这个性能优化机制。
Piper破壳
2024/12/20
2660
Python小屋刷题神器最近升级的新功能介绍
《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科课程“Python应用开发”配套教材,清华大学出版社2020年度畅销图书(本书第二版为2019、2020年度畅销图书)
Python小屋屋主
2021/03/16
1.5K0
Python小屋刷题神器最近升级的新功能介绍
Python程序模拟手工推算考虑兔子寿命的斐波那契数列
《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科课程“Python应用开发”配套教材,清华大学出版社2020年度畅销图书(本书第二版为2019、2020年度畅销图书)
Python小屋屋主
2021/03/16
6360
Python程序模拟手工推算考虑兔子寿命的斐波那契数列
Python批量为视频嵌入三层弹幕
给定若干视频文件,为其批量添加三层弹幕,要求弹幕文字嵌入到原始画面下方,不遮挡原始画面中的有效内容。假设原始画面中主要背景色为白色。
Python小屋屋主
2021/03/18
8300
Python批量为视频嵌入三层弹幕
Python 相关文件常见的后缀名详解[通俗易懂]
常见的 Python 文件后缀有:py、pyc 、pyo、 pyi、pyw、 pyd、 pyx 等。
全栈程序员站长
2022/09/29
4.2K0
Python 相关文件常见的后缀名详解[通俗易懂]
不了解这12个语法糖,别说你会Java!
本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理
用户5224393
2019/10/29
7940
不了解这12个语法糖,别说你会Java!
编写高质量代码:改善Python程序的91个建议.1
就是先写注释,再写逻辑.对于不用的代码要不要保留的.注意空行的使用,保持上下文语言的理解性,调用者在上,被调用者在下
云深无际
2021/03/12
4140
编写高质量代码:改善Python程序的91个建议.1
Python内置(2)异常、常量、globals
Python有66个内置的异常(exception)类,每个类都旨在供用户,标准库和其他所有人使用,作为解释和捕获代码中错误的有意义的方法。
一只大鸽子
2022/12/06
9780
Python内置(2)异常、常量、globals
Python抛出异常_python抛出异常的作用
在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误
全栈程序员站长
2022/11/02
2.7K0
Java 断言 assert 你真的会用嘛?
Java assert 断言机制是 Java 5 中推出的新特性,它主要用于在程序运行时检查状态或假设的正确性,并在不正确时抛出 AssertionError 异常。使用 assert 断言可以使代码更加健壮、可靠,提高程序的可维护性和可读性。
闻说社
2023/05/24
2K0
C语言assert函数(isspace函数)
对于断言,相信大家都不陌生,大多数编程语言也都有断言这一特性。简单地讲,断言就是对某种假设条件进行检查。在 C 语言中,断言被定义为宏的形式(assert(expression)),而不是函数,其原型定义在<assert.h>文件中。其中,assert 将通过检查表达式 expression 的值来决定是否需要终止执行程序。也就是说,如果表达式 expression 的值为假(即为 0),那么它将首先向标准错误流 stderr 打印一条出错信息,然后再通过调用 abort 函数终止程序运行;否则,assert 无任何作用。
全栈程序员站长
2022/07/28
9630
C语言assert函数(isspace函数)
不了解这12个语法糖,别说你会Java!
本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理
java架构师
2019/05/17
8110
断言(assert)的用法
我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错"。
云深无际
2021/04/14
1.1K0
断言(assert)的用法
python Exception(异常处
python异常:    python在运行时错误称为异常        语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译。        逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成、计算或者出结果需要的过程无法执行等。    默认情况下:python脚本执行过程中出现异常后,脚本执行将被终止。    python 异常是一个对象,表示错误或意外的情况    在python检测到一个错误时,将触发一个异常:        python可以通过异常传导机制传递一个异常对象,发出一个异常情况出现的信号。        程序员也可以在代码中托运触发异常    python异常也可以理解为:程序出现了错误,而在正常控制流以外采取的行为        第一阶段:解释器触发异常,此时当前程序流将被打断。        第二阶段:异常处理,如忽略非致命错误、减轻错误带来的影响等。 异常的功用    错误处理:        python的默认处理:停止程序,打印错误消息        使用try语句处理异常,并从异常中恢复    事件通知:        用于发出有效状态信号    特殊情况处理:        无法调整代码去处理的场景    终止行为:        try/finally语句可确保执行必需的结束处理机制    非常规控制流程:        异常是一种高级跳转(goto)机制 异常对象    python异常是内置的经典类exception的子类的实例        为了向后兼容,python还允许使用字符串或任何经典类实例        python2.5之后,exception是从BaseException继承的新式类(即exception的父类是BaseException类)    python自身引发的所有异常都是Exception的子类的实例    大多的标准异常都是由StandardError派生的,其有3个抽象的子类        ArithmeticError:由于算术错误而引发的异常基类;包括:OverflowError、ZeroDivisionError、FloatingPorintError        LookupError:容器在接收到一个无效的键或索引时引发的异常的基类;包括:IndexError、KeyError        EnvironmentError:由于外部原因而导致的异常的基类;包括:IOError、OSError、WindowsError 标准异常类    AssertionError:断言语句失败    AttributeError:属性引用或赋值失败    FloatingPointError:浮点型运算失败    IOError:I/O操作失败    ImportError:import语句不能找到要导入的模块,或者不能找到该模块特别请求的名称。    IndentationError:解析器遇到了一个由于错误的缩进而引发的语法错误    IndexError:用来索引序列的整数超出了范围。    KeyError:用来索引映射的键不在映射中    KeyboardInterrupt:用户按了中断键(ctrl+c、ctrl+break、delete键)    MemoryError:运算耗尽内存    NameError:引用了一个不存在的变量名    NotImplementedError:由抽象基类引发的异常,用于指示一个具体的子类必须覆盖一个方法    OSError:由模块os中的函数引发的异常,用来指示平台相关的错误    OverflowError:整数运算的结果太大导致溢出    SyntaxError:语法错误    SystemError:python解释器本身或某些扩展模块中的内部错误     TypeError:对某对象执行了不支持的操作    UnboundLocalError:引用未绑定值的本地变量     UnicodeError:在Unicode的字符串之间进行转换时发生的错误     ValueError:应用于某个对象的操作或函数,这个对象具有正确的类型,但确有不适当的值    WindowsError:模块OS中的函数引发的异常,用于指示与windowsSHUDR QAYK     ZeroDivisionError:除数为0引发的异常   检测和处理异常:    异常通过try语句来检测:任何在try语句块中的代码都会被监测,以检查有无异常发生。    tr语句主要有两种形式:        try-except:检测和处理异常            可以有多个e
py3study
2020/01/06
2.2K0
Python字节码介绍
如果你曾经编写亦或只是使用Python语言,那么你可能已经习惯了看Python源码文件; 源码的文件名以.py结尾。或许你也已经注意到了另一种类型的文件,文件名以.pyc结尾,或许你已经听说过它们就是Python的“字节码”文件。(但在Python 3上却难觅其踪 -- 原因是它们不再与.py文件出现在同一个目录中,而是放在一个名为__pycache__的子目录中了)。或许你也已听说过这是一种程序加速机制。通过防止Python每次运行时都重新解析源代码从而加快程序运行。
IT派
2018/07/30
1.6K0
Python字节码介绍
推荐阅读
相关推荐
Python批量提取Excel文件中文本框组件里的文本
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档