我应该只用==与((None,None))元组进行比较吗?

时间:2019-08-14 07:41:14

标签: python tuples nonetype comparison-operators

我有一个函数,可以返回两个整数的元组或(None, None)的元组:

(出于这个问题的目的,我们假定此返回格式是唯一的方法,并且不能更改)

from typing import Tuple, Union

def foo(n: int) -> Union[Tuple[int, int], Tuple[None, None]]:
    if n < 0:
        return None, None
    return n, n

然后,我想编写一个pytest单元测试来测试该功能。人们总是说应该将Noneis进行比较,但这显然行不通:

def test_foo():
    assert foo(1) == (1, 1)
    assert foo(-1) is (None, None)  # fails obviously!

在这种情况下,我应该只使用==来比较结果吗?

def test_foo():
    assert foo(1) == (1, 1)
    assert foo(-1) == (None, None)  # best way?

2 个答案:

答案 0 :(得分:3)

您应该使用==,但是使用is会失败的确不是显而易见的。

例如

def foo():
    return (1, 2)

print(foo() is foo())

MAY 实际上返回True(在CPython中确实如此,不确定其他实现)。

Tuples不被视为实体,而是值。值的身份不可以使用,因为它可能匹配或不匹配(例如字符串或数字)。

如果在上面的代码中使用[1, 2]而不是(1, 2),则可以保证is返回False,因为列表是实体,不是值,并且身份可以是以可预测的方式使用。

答案 1 :(得分:2)

另一个建议,使用列表推导检查is None的所有返回值:

def test_foo():
    assert foo(1) == (1, 1)
    assert all(i is None for i in foo(-1))