【发布时间】:2018-10-08 10:47:55
【问题描述】:
在检查了几个 python 开源项目后,我发现了相同的函数有assert <> 和assert <> is True 的测试用例的例子。
而且我找不到关于在有和没有完整条件的情况下使用 assert 语句的最佳实践的答案。
例如函数
def is_even(number):
if number % 2 == 0:
return True
else:
return False
可以这样测试
assert is_even(6) is True
assert is_even(6) == True
但也可以像这样进行测试
assert is_even(6)
如果函数is_even 将在此处更改,我会看到问题原因
def is_even(number):
if number % 2 == 0:
return <>
else:
return False
<> 可以更改为任何数字(0 除外)或非空字符串 - 最后一次测试将通过。但这将是另一个功能。
我看到了 this 和 this SO 关于断言用法的问题,但似乎它们并没有完全涵盖我的问题。
从另一边 PEP 8 specification 有这样的例子
-
不要使用
==将布尔值与 True 或 False 进行比较Yes: if greeting: No: if greeting == True: Worse: if greeting is True:
但这也与assert 的使用有关吗?
【问题讨论】:
-
是的,关于布尔值的 PEP-8 建议也适用于
assert的用法。同样,该函数应写为:def is_even(number):return number % 2 == 0 -
你到底在问什么?
-
@DeepSpace 的问题是仅使用
assert is_even(6)或更好地使用assert is_even(6) is True进行测试是一种好习惯,因为可以更改功能并且assert也将通过,但这将是另一个函数(将返回另一个结果) -
还要注意
assert经常被误用,它应该只用于健全性检查(应该不可能的事情),你应该raise一个例外,比如输入错误数据 -
PEP-8 在这一点上非常清楚:不要使用 == 将布尔值与 True 或 False 进行比较。。您在哪里执行此操作并不重要。这些示例使用
if,但这并不重要。该断言适用于任何上下文。测试是针对if、assert、while、条件表达式还是作为其结果存储在变量中的独立表达式完成并不重要。