首页 > 解决方案 > 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规范有这样的例子

但这也与assert使用有关吗?

标签: pythonassertassertion

解决方案


像这样的代码

if a:
    return True
else:
    return False

反正是不干净的。return a如果需要一个布尔值(而不仅仅是一个真值),它应该写成or return bool(a),.

如果您使用v == Truev 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) == Trueassert is_in_rectangle(point) is True将是错误的,因为任何真实的值(例如[ 1 ])就足够了。检查一个明确True的结果将假设太多。

所以,基线:不要将真实值与True. 仅在您对值有非常具体的要求时才比较结果值,True例如“必须是布尔值,而不仅仅是真实”(这种情况很少见)。


推荐阅读