欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python规范:用用assert

程序员文章站 2022-07-21 18:22:00
什么是assert assert的语法: 例: 相当于 assert 在程序中的作用,是对代码做一些 internal 的 self-check。使用 assert,就表示你很确定。这个条件一定会发生或者一定不会发生。 注意:不能在使用assert时加上括号 assert(1 == 2, 'This ......

什么是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核心技术与实战》专栏