zoukankan      html  css  js  c++  java
  • Python规范:用用assert

    什么是assert

      assert的语法:

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

      例:

    assert 1 == 2,  'assertion is wrong'
    Traceback (most recent call last):
      File "assert.py", line 4, in <module>
        assert 1 == 2,  'assertion is wrong'
    AssertionError: assertion is wrong

      相当于

    if __debug__:
        if not expression1: raise AssertionError(expression2)
      assert 在程序中的作用,是对代码做一些 internal 的 self-check。使用 assert,就表示你很确定。这个条件一定会发生或者一定不会发生。
      注意:不能在使用assert时加上括号
    assert(1 == 2, 'This should fail')
    # 输出
    <ipython-input-8-2c057bd7fe24>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
      assert(1 == 2, 'This should fail')

     assert 的用法

      举例几个常用的场景。
      1.商品打折。要求输入为原来的价格和折扣,输出是折后的价格   
    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的条件为False,会raise

    apply_discount(100, 0.2)
    80.0
    
    apply_discount(100, 2)
    AssertionError: price should be greater or equal to 0 and less or equal to original price

      2.后台想知道每个商品的平均销售价格,算法是销售总额 / 销售数目:

    def calculate_average_price(total_sales, num_sales):
        assert num_sales > 0, 'number of sales should be greater than 0'
        return total_sales / num_sales

      加入了 assert 语句,规定销售数目必须大于 0.

      3.检查输入是否list

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

    assert 错误示例

       assert 的检查是可以被关闭的,比如在运行 Python 程序时,加入-O这个选项就会让 assert 失效。因此,一旦 assert 的检查被关闭,user_is_admin() 和 course_exist() 这两个函数便不会被执行。这就会导致严重问题:

    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)

      对于程序中的一些 run-time error,还是得用异常处理

    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)  

    参考

       极客时间《Python核心技术与实战》专栏

     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Spring(4)——面向切面编程(AOP模块)
    Spring(3)——装配 Spring Bean 详解
    Spring(2)——Spring IoC 详解
    Spring学习(1)——快速入门
    彼得原理(The Peter Principle)
    默菲定律 [Murphy's Law]
    EXTJS 表单提交
    在java 中,数组与 List<T> 类型的相互转换
    Eclipse 工作目录被破坏,导致Eclipse 打不开
    EXTJS 密码确认与验证
  • 原文地址:https://www.cnblogs.com/xiaoguanqiu/p/11301253.html
Copyright © 2011-2022 走看看