Python中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)
极客时间规定,必须是 admin 才能删除专栏,并且这个专栏课程必须存在。有的同学一看,很熟悉的需求啊,所以在前面加了相应的 assert 检查。那么我想让你思考一下,这样写到底对不对呢?
Answer #
assert 的检查是可以被关闭的,比如在运行 Python 程序时,加入-O这个选项就会让 assert 失效。因此,一旦 assert 的检查被关闭,user_is_admin() 和 course_exist() 这两个函数便不会被执行。这就会导致:
-
任何用户都有权限删除专栏课程;并且,不管这个课程是否存在,他们都可以强行执行删除操作。
-
这显然会给程序带来巨大的安全漏洞。
所以,正确的做法,是使用条件语句进行相应的检查,并合理抛出异常:
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)