Python学习之异常断言详解

该章节我们来学习 异常的最后一个知识点 - 断言 ,断言是判断一个表达式,在表达式为 False 的时候触发异常。表达式我们可以对号入座,可以是条件语句中的声明,也可以是是 while 循环中的声明。

它们都是对一件事情进行 True 或者 False 的判断, 断言 也是如此,断言发现后面的表达式为 False 的时候 就会主动抛出异常。

在 Python 中 assert 就是断言的关键字,乍一听起来 似乎和 raise 关键字 的功能一样。其实 assert 断言的使用要比 raise 更加的简洁, rais 是生硬的抛出一个异常,而 assert 是先进行一个判断然后再根据结果选择是否要抛出这个异常。

比如我们对自己写的函数的结果进行一个判断,如果选择 raise 则需要自己手动写一个 if 按断的条件语句,然后再进行 raise ;而 assert 只要一行就可以轻松完成我们的任务

断言的功能与语法

断言的功能:简单来说,断言就是用于判断的一个表达式,当表达式的条件返回为 False 的时候触发异常。

断言的语法:示例如下

# 用法:
assert exception, message

# 参数:
# exception:表达式,一般是判断相等;或者是判断是某种数据类型的 bool 判断的语句,再决定是否抛出异常
# message:指的是具体的错误信息,选填参数,可以不填写。(但是建议还是填写上)
# 返回值:无返回值(虽然表达式有返回值,但 assert 没有;表达式为 Treu , assert 将不会触发任何异常)

看一个简单的例子:

assert 1 != 1, '返回结果 \'False\' 1 等于 1'

# >>> 执行结果如下:
# >>> AssertionError: 返回结果 'False' 1 等于 1

# ********************************************

assert 1 > 2, '返回结果 \'False\' ,抛出异常'

# >>> 执行结果如下:
# >>> AssertionError: 返回结果 'False' ,抛出异常

断言小实战

接下来我们根据我们之前面向对象章节的Python学习之面向函数转面向对象详解进行添加异常及异常的捕获然后再增加一个批量添加的功能。

源码如下:

"""
    @Author:Neo
    @Date:2020/1/16
    @Filename:students_info.py
    @Software:Pycharm
"""

class NotArgError(Exception):
    def __init__(self, message):
        self.message = message

class StudentInfo(object):
    def __init__(self, students):
        self.students = students

    def get_by_id(self, student_id):
        return self.students.get(student_id)

    def get_all_students(self):
        for id_, value in self.students.items():
            print('学号:{}, 姓名:{}, 年龄:{}, 性别:{}, 班级:{}'.format(
                id_, value['name'], value['age'], value['sex'], value['class_number']
            ))
        return self.students

    def add(self, **student):
        try:
            self.check_user_info(**student)
        except Exception as e:
            raise e
        self.__add(**student)

    def adds(self, new_students):
        for student in new_students:
            try:
                self.check_user_info(**student)
            except Exception as e:
                print(e, student.get('name'))
                continue
            self.__add(**student)

    def __add(self, **student):
        new_id = max(self.students) + 1
        self.students[new_id] = student

    def delete(self, student_id):
        if student_id not in self.students:
            print('{} 并不存在'.format(student_id))
        else:
            user_info = self.students.pop(student_id)
            print('学号是{}, {}同学的信息已经被删除了'.format(student_id, user_info['name']))

    def deletes(self, ids):
        for id_ in ids:
            if id_ not in self.students:
                print(f'{id_} 不存在学生库中')
                continue
            student_info = self.students.pop(id_)
            print(f'学号{id_} 学生{student_info["name"]} 已被移除')

    def update(self, student_id, **kwargs):
        if student_id not in self.students:
            print('并不存在这个学号:{}'.format(student_id))
        try:
            self.check_user_info(**kwargs)
        except Exception as e:
            raise e

        self.students[student_id] = kwargs
        print('同学信息更新完毕')

    def updates(self, update_students):
        for student in update_students:
            try:
                id_ = list(student.keys())[0]
            except IndexError as e:
                print(e)
                continue
            if id_ not in self.students:
                print(f'学号{id_} 不存在')
                continue
            user_info = student[id_]
            try:
                self.check_user_info(**user_info)
            except Exception as e:
                print(e)
                continue
            self.students[id_] = user_info
        print('所有用户信息更新完成')

    def search_users(self, **kwargs):

        assert len(kwargs) == 1, '参数数量传递错误'

        values = list(self.students.values())
        key = None
        value = None
        result = []

        if 'name' in kwargs:
            key = 'name'
            value = kwargs[key]
        elif 'sex' in kwargs:
            key = 'sex'
            value = kwargs['sex']
        elif 'class_number' in kwargs:
            key = 'class_number'
            value = kwargs[key]
        elif 'age' in kwargs:
            key = 'age'
            value = kwargs[key]
        else:
            raise NotArgError('没有发现搜索的关键字')

        for user in values:  # [{name, sex, age, class_number}, {}]
            if value in user[key]:
                result.append(user)
        return result

    def check_user_info(self, **kwargs):
        assert len(kwargs) == 4, '参数必须是4个'

        if 'name' not in kwargs:
            raise NotArgError('没有发现学生姓名参数')
        if 'age' not in kwargs:
            raise NotArgError('缺少学生年龄参数')
        if 'sex' not in kwargs:
            raise NotArgError('缺少学生性别参数')
        if 'class_number' not in kwargs:
            raise NotArgError('缺少学生班级参数')

        name_value = kwargs['name']  # type(name_value)
        age_value = kwargs['age']
        sex_value = kwargs['sex']
        class_number_value = kwargs['class_number']
        # isinstace(对比的数据, 目标类型) isinstance(1, str)

        if not isinstance(name_value, str):
            raise TypeError('name应该是字符串类型')
        if not isinstance(age_value, int):
            raise TypeError('age 应该是整型')
        if not isinstance(sex_value, str):
            raise TypeError('sex应该是字符串类型')
        if not isinstance(class_number_value, str):
            raise TypeError('class_number应该是字符串类型')

students = {
    1: {
        'name': 'Neo',
        'age': 18,
        'class_number': 'A',
        'sex': 'boy'
    },
    2: {
        'name': 'Jack',
        'age': 16,
        'class_number': 'B',
        'sex': 'boy'
    },
    3: {
        'name': 'Lily',
        'age': 18,
        'class_number': 'A',
        'sex': 'girl'
    },
    4: {
        'name': 'Adem',
        'age': 18,
        'class_number': 'C',
        'sex': 'boy'
    },
    5: {
        'name': 'HanMeiMei',
        'age': 18,
        'class_number': 'B',
        'sex': 'girl'
    }
}

if __name__ == '__main__':
    student_info = StudentInfo(students)
    user = student_info.get_by_id(1)
    student_info.add(name='Marry', age=16, class_number='A', sex='girl')
    users = [
        {'name': 'Atom', 'age': 17, 'class_number': 'B', 'sex': 'boy'},
        {'name': 'Lucy', 'age': 18, 'class_number': 'C', 'sex': 'girl'}
    ]
    student_info.adds(users)
    student_info.get_all_students()
    print('------------------------------------------------------')

# >>> 执行结果如下:
# >>> 学号:1, 姓名:Neo, 年龄:18, 性别:boy, 班级:A
# >>> 学号:2, 姓名:Jack, 年龄:16, 性别:boy, 班级:B
# >>> 学号:3, 姓名:Lily, 年龄:18, 性别:girl, 班级:A
# >>> 学号:4, 姓名:Adem, 年龄:18, 性别:boy, 班级:C
# >>> 学号:5, 姓名:HanMeiMei, 年龄:18, 性别:girl, 班级:B
# >>> 学号:6, 姓名:Marry, 年龄:16, 性别:girl, 班级:A
# >>> 学号:7, 姓名:Atom, 年龄:17, 性别:boy, 班级:B
# >>> 学号:8, 姓名:Lucy, 年龄:18, 性别:girl, 班级:C
# >>> ------------------------------------------------------

    student_info.deletes([7, 8])
    student_info.get_all_students()
    print('------------------------------------------------------')

# >>> 执行结果如下:
# >>> ------------------------------------------------------
# >>> 学号7 学生Atom 已被移除
# >>> 学号8 学生Lucy 已被移除
# >>> 学号:1, 姓名:Neo, 年龄:18, 性别:boy, 班级:A
# >>> 学号:2, 姓名:Jack, 年龄:16, 性别:boy, 班级:B
# >>> 学号:3, 姓名:Lily, 年龄:18, 性别:girl, 班级:A
# >>> 学号:4, 姓名:Adem, 年龄:18, 性别:boy, 班级:C
# >>> 学号:5, 姓名:HanMeiMei, 年龄:18, 性别:girl, 班级:B
# >>> 学号:6, 姓名:Marry, 年龄:16, 性别:girl, 班级:A
# >>> ------------------------------------------------------

    student_info.updates([
        {1: {'name': 'Jone', 'age': 18, 'class_number': 'A', 'sex': 'boy'}},
        {2: {'name': 'Nike', 'age': 18, 'class_number': 'A', 'sex': 'boy'}}
    ])
    student_info.get_all_students()
    print('------------------------------------------------------')

# >>> 执行结果如下:
# >>> ------------------------------------------------------
# >>> 所有用户信息更新完成
# >>> 学号:1, 姓名:Jone, 年龄:18, 性别:boy, 班级:A
# >>> 学号:2, 姓名:Nike, 年龄:18, 性别:boy, 班级:A
# >>> 学号:3, 姓名:Lily, 年龄:18, 性别:girl, 班级:A
# >>> 学号:4, 姓名:Adem, 年龄:18, 性别:boy, 班级:C
# >>> 学号:5, 姓名:HanMeiMei, 年龄:18, 性别:girl, 班级:B
# >>> 学号:6, 姓名:Marry, 年龄:16, 性别:girl, 班级:A
# >>> ------------------------------------------------------

    result = student_info.search_users(name='d')
    print(result)
    print('------------------------------------------------------')

# >>> 执行结果如下:
# >>> [{'name': 'Adem', 'age': 18, 'class_number': 'C', 'sex': 'boy'}]

    result = student_info.search_users(name='小')
    print(result)
    print('------------------------------------------------------')

# >>> 执行结果如下:
# >>> ------------------------------------------------------
# >>> []
# >>> ------------------------------------------------------

    result = student_info.search_users(name='')
    print(result)
    result = student_info.search_users(name='小')
    print(result)
    print('------------------------------------------------------')
# >>> 执行结果如下:
# >>> ------------------------------------------------------
# >>> [{'name': 'Jone', 'age': 18, 'class_number': 'A', 'sex': 'boy'}, {'name': 'Nike', 'age': 18, 'class_number': 'A', 'sex': 'boy'}, {'name': 'Lily', 'age': 18, 'class_number': 'A', 'sex': 'girl'}, {'name': 'Adem', 'age': 18, 'class_number': 'C', 'sex': 'boy'}, {'name': 'HanMeiMei', 'age': 18, 'class_number': 'B', 'sex': 'girl'}, {'name': 'Marry', 'age': 16, 'class_number': 'A', 'sex': 'girl'}]
# >>> []

    result = student_info.search_users(name='')
    print(result)

以上就是Python学习之异常断言详解的详细内容,更多关于Python异常断言的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python常用断言函数实例汇总

    Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Python 解释器会报 AssertionError 错误. assert 语句的语法结构为: assert 表达式 assert 语句的执行流程可以用 if 判断语句表示(等效),如下所示: if 表达式==True: 程序继续执行 else: 程序报 AssertionError 错误 有读者可能会问,明明 assert 会令程序崩溃,为什

  • python assert断言的实例用法

    断言声明是一种方便的程序调试方式. 1.可将断言视为debug工具,Python的实现也符合这种设计理念.assert语句的执行依赖于__debug__,且默认值为True. 2.如果__debug__为True,则仅执行assert语句. 实例 assert 可以同时声明两个 expression,例如 assert expression1, expression2 等价于 if __debug__: if not expression1: raise AssertionError(expre

  • Python中优雅使用assert断言的方法实例

    目录 什么是 assert 断言 断言和异常的使用场景 使用断言的几个原则 建议不使用断言的情况: 总结 什么是 assert 断言 Assert statements are a convenient way to insert debugging assertions into a program 断言声明是用于程序调试的一个便捷方式.断言可以看做是一个 debug 工具,Python 的实现也符合这个设计哲学,在 Python 中 assert 语句的执行是依赖于__debug__这个内置

  • python异常处理、自定义异常、断言原理与用法分析

    本文实例讲述了python异常处理.自定义异常.断言原理与用法.分享给大家供大家参考,具体如下: 什么是异常: 当程序遭遇某些非正常问题的时候就会抛出异常:比如int()只能处理能转化成int的对象,如果传入一个不能转化的对象就会报错并抛出异常 常用的异常有: ValueError :传入无效的错误的参数 TypeError:进行了对类型无效的操作 IndexError:序列中没有此索引 NameError:使用未定义的变量 更多更具体的异常可以参考Python官方文档,读读官方文档更健康 异常

  • Python断言assert的用法代码解析

    在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假. 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常. assert的语法格式: assert expression 它的等价语句为: if not expression: raise AssertionError 这段代码用来检测数据类型

  • Python学习之异常断言详解

    该章节我们来学习 异常的最后一个知识点 - 断言 ,断言是判断一个表达式,在表达式为 False 的时候触发异常.表达式我们可以对号入座,可以是条件语句中的声明,也可以是是 while 循环中的声明. 它们都是对一件事情进行 True 或者 False 的判断, 断言 也是如此,断言发现后面的表达式为 False 的时候 就会主动抛出异常. 在 Python 中 assert 就是断言的关键字,乍一听起来 似乎和 raise 关键字 的功能一样.其实 assert 断言的使用要比 raise 更

  • Python学习之日志模块详解

    目录 日志的作用 日志的等级 logging 模块的使用 logging 模块演示小案例 OK,今天我们来学习一下 python 中的日志模块,日志模块也是我们日后的开发工作中使用率很高的模块之一,接下来们就看一看今天具体要学习日志模块中的那些内容吧. 日志的作用 说到日志,我们完全可以想象为现实生活中的日记.日记是我们平时记录我们生活中点点滴滴的一种方法,而日志我们可以认为是 程序的日记 ,程序的日记是用来记录程序的行为,一般来说我们可以通过日志记录一些程序的重要信息. 比如哪里报错了?报错原

  • Python 错误和异常代码详解

    程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错... 程序员的一生,始终伴随着一件事 - 调试(错误检测.异常处理).反反复复,最可怕的是:不仅自己的要改,别人的也要改...一万头草泥马奔腾而过! 错误 程序错误,主要分为三类: 语法错误 逻辑错误 运行时错误 语法错误 语法错误(也称:解析错误):是指不遵循语言的语法结构引起的错误(程序无法正常编译/运行). 在编译语言(例如:C++)中,语法错误只在编译期出现,编译器要求所有的语法都正确,才能正常编译.不过对于直译语言(例如:

  • Python学习之循环方法详解

    目录 for循环 while循环 拓展:列表推导式 常见的推导式方法 循环的继续与退出(continue与break) continue的使用 break的使用 循环实现九九乘法表 什么是循环? —> 循环是有着周而复始的运动或变化的规律:在 Python 中,循环的操作也叫做 ‘遍历’ . 与现实中一样,Python 中也同样存在着无限循环的 方法与有限循环的方法.接下来我们就先看看有限循环的方法 —> for 循环 for 循环 for 循环的功能:通过 for 关键字将列表.元组.字符串

  • Python学习之面向对象编程详解

    目录 什么是面向对象编程(类) 类的关键字-class 类的定义与使用 类的参数-self self的解析与总结 类的构造函数 构造函数的创建方法 关于对象的生命周期 什么是面向对象编程(类) 利用(面向)对象的(属性和方法)去进行编码的过程即面向对象编程 自定义对象数据类型就是面向对象中的类(class)的概念 类的关键字 - class class 关键字用来声明类,类的名称首字母大写,多单词的情况下每个单词首字母大写(即驼峰命名法).在我们一开始学习 Python 的时候说过,要尽量避免使

  • Python学习之加密模块使用详解

    目录 hashlib 模块 hashlib 模块的介绍 hashlib 模块中的常用加密方法 hashlib模块情景练习 base64 模块 base64 模块的介绍 base64 模块 模块中的常用方法 base64 模块的情景练习 hashlib 模块 hashlib 模块的介绍 hashlib 模块中拥有很多的加密算法,我们并不需要关心加密算法的实现方法.只需要调用我们需要的加密函数,就可以帮助我们对数据进行加密. 它的加密算法有很多,不仅如此,hashlib 中很多加密算法加密难度很大,

  • Python学习之虚拟环境原理详解

    目录 认识虚拟环境 Python中的虚拟环境工具 Virtualenv Treminal 终端演示 该章节我们学习虚拟环境的相关知识,虚拟环境对于刚刚使用Python的初学者来说使用的概率可能会比较低.但是我们依然要对它有一定的了解. 认识虚拟环境 在我们平时的工作环境中,可能会存在一台电脑存在多个版本的 python 的情况 . 比如我们有一个 Python2.7的版本,还有一个 Python3.8的环境,它们两个都存在与我们当前的系统中.这就造成了一个问题,两个版本都在同一个环境下,造成 p

  • Python学习之异常中的finally使用详解

    目录 finally的功能与用法 finally示例案例 finally触发的必然性与优先级 try语法伴随except或finally的必然性 finally的历史 今天我们来学习一下 异常语法 中的另一个成员 —> finally : 通过学习 finally ,可以帮助我们更好的处理异常. finally 的功能与用法 finally 的功能:finally的是最后的意思,配合异常的语法来说,它就是最后执行的代码块. 无论是否发生了异常,一定会执行 finally 的代码块 在函数中,即便

  • python标准库学习之sys模块详解

    目录 前言 处理命令行参数 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.platform 返回操作系统平台名称 sys.stdin.readline()与input sys.stdout与print 总结 补充:sys 模块的实例 前言 sys模块是与python解释器交互的一个接口.sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含

  • 对Python中内置异常层次结构详解

    如下所示: BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- BufferError | +-- ArithmeticError | | +-- FloatingPointError | | +-- OverflowError | | +-- ZeroDivisionError | +-- Asse

随机推荐