python - Python assert 语句中的比较
问题描述
在检查了几个 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
最后一次测试将通过。但这将是另一个功能。
我看到了这个和这个关于断言用法的问题,但似乎它们并没有完全涵盖我的问题。
从另一面 PEP 8规范有这样的例子
不要使用将布尔值与 True 或 False 进行比较
==
Yes: if greeting: No: if greeting == True: Worse: if greeting is True:
但这也与assert
使用有关吗?
解决方案
像这样的代码
if a:
return True
else:
return False
反正是不干净的。return a
如果需要一个布尔值(而不仅仅是一个真值),它应该写成or return bool(a)
,.
如果您使用v == True
或v is True
完全取决于情况。第一个将检查 value 是否等于value True
。一个值是否这样做,也取决于这个值的类(例如1 == True
,为真,1.0 == True
为真,但1j == True
为假)。
如果您比较 using is
,那么您绝对清楚您接受该值True
而不是其他任何东西。
然而,在大多数情况下,我认为只是陈述assert f(x)
在语义上是正确的做法。例如,对于像assert is_in_rectangle(point)
. 将其拼写为错误assert is_in_rectangle(point) == True
或assert is_in_rectangle(point) is True
将是错误的,因为任何真实的值(例如[ 1 ]
)就足够了。检查一个明确True
的结果将假设太多。
所以,基线:不要将真实值与True
. 仅在您对值有非常具体的要求时才比较结果值,True
例如“必须是布尔值,而不仅仅是真实”(这种情况很少见)。
推荐阅读
- r - R中是否有一个函数来分隔没有分隔符的.txt文件?
- arrays - AssemblyScript 数组访问导致内存越界
- python - 正则表达式捕获具有不明确逻辑 OR 的组
- android - 房间迁移未找到表格列
- algorithm - 是否有一个散列函数以一种独特的方式将两个整数映射到一个整数?
- python - 如何在 Python 中使用 Selenium 和 BeautifulSoup4 抓取多个 URL
- c - 将目录的路径传递给函数,C语言
- tensorflow - 不使用 GPU 的 Tensorflow.js 示例
- java - 如何在 Android 中读取 Firebase 用户数据
- c# - C# RemoveBG API