社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python小屋 • 3 年前 • 620 次点击  

明天不发文,提前祝所有朋友

过年好,春节快乐!

推荐图书:

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

京东购买链接:https://item.jd.com/12668739.html

天猫、当当均有销售,可以选择自己常用平台搜索“董付国 第3版”找到本书。
配套资源:教学大纲、电子教案、微课视频、PPT课件、例题源码、习题答案、考试系统。
适用专业:计算机、网络工程、软件工程以及相关专业。
适用学时:>=64
页数:381
定价:59.8
教学大纲: 《Python程序设计(第3版)》配套教学大纲
习题答案:《Python程序设计(第3版)》课后习题答案


目录(二级)


第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有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(累计印刷超过120次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1000篇原创技术文章;发送消息“会议”或“培训”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过500节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习1318道客观题和189道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/107549
 
620 次点击