zoukankan      html  css  js  c++  java
  • assert 笔记

    什么是assert?

    Python 的 assert 语句是一个 debug 的好工具,主要用于测试一个条件是否满足。如果测试的条件满足,则什么也不做,相当于执行了 pass 语句;
    如果测试条件不满足,便会抛出异常 AssertionError, 并返回具体的错误信息(optional)。

    它具体的语法是下面这样的:

    assert_stmt ::= "assert" expression ["," expression]
    

    我们先来看一个简单形式的 assert expression, 比如下面这个例子:

    assert 1 == 2
    

    它就相当于下面两行代码:

    if __debug__:
        if not expression: raise AssertionError
    

    再来看 assert expression1, expression2的形式,比如下面这个例子:

    assert 1 == 2, 'assertion is wrong'
    

    它就相当于下面这两行代码:

    if __debug__:
        if not expression1: raise AssertionError(expression2)
    

    这里的__debug__是一个常数。如果Python程序执行时附带了-O这个选项,比如Python test.py -O, 那么程序中所有的 assert 语句都会失效,常数
    __debug__便为False;反之__debug__则为True。

    直接对常数__debug__赋值时非法的,因为它的值在解释器开始运行时就已经决定了,中途无法改变。

    一定记住,不要在使用 assert 时加入括号,比如下面这个例子:

    assert(1 == 2, 'This should fail')
    """
    SyntaxWarning: assertion is always true, perhaps remove parentheses?
      assert(1 == 2, 'This should fail')
    """
    

    总的来说,assert 在程序中的作用,是对代码做一些内部(internal)的自检(self-check)。使用 assert,就表示你很确定。这个条件一定会发生
    或者一定不会发生。

    assert使用

    假设要做一个促销活动,如下面的apply_discount()函数,要求输入为原来的价格和折扣,输出的是折后的价格。

    def apply_discount(price, discount):
        updated_price = price * (1 - discount)
        assert 0 <= updated_price <= price, 'price should be greater or equal to 0 and less or equal to original price'
        return updated_price
    

    可以看到,在计算新价格的后面,我们还写了一个assert语句,用来检查折后价格,这个必须大于等于0、小于等于原来的价格,否则就抛出异常。

    assert 常见用法

    def func(input):
        assert isinstance(input, list), 'input must be type of list'
        # 下面的操作都是基于前提:input 必须是 list
        if len(input) == 1:
            ...
        elif len(input) == 2:
            ...
        else:
            ... 
    

    这里的func中各种逻辑的前提是input是一个list,所以可以在开头加一句assert,防止程序出错。

    assert错误使用

    数据库的删除操作

    def delete_course(user, course_id):
        assert user_is_admin(user), 'user must be admin'
        assert course_exist(course_id), 'course id must exist'
        delete(course_id)
    

    不可以用assert, 因为assert可以通过-O取消,这样随便一个用户都可以删除,而且不管这个id是否存在都可以强制执行删除。正确做法:

    def delete_course(user, course_id):
        if not user_is_admin(user):
            raise Exception('user must be admin')
        if not course_exist(course_id):
            raise Exception('coursde id must exist')
        delete(course_id)  
    
  • 相关阅读:
    else 的特殊用法和三目运算
    pycharm快捷键
    5、【排序算法】选择排序
    4、【排序算法】希尔排序
    3、【排序算法】直接插入排序
    1、【常见算法】不使用第三个变量交换两个数的值
    1、【排序算法】冒泡排序
    7、【树形结构】哈夫曼树
    6、【树形结构】红黑树
    5、【树形结构】AVL树
  • 原文地址:https://www.cnblogs.com/wuyongqiang/p/11193991.html
Copyright © 2011-2022 走看看