我应该只使用 `==` 来比较 `(None, None)` 元组吗?

Should I just use `==` to compare to `(None, None)` tuple?

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

的元组

(为了这个问题的目的,让我们假设这种return格式是唯一的方法,并且不能改变)

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?

你应该使用 ==,但实际上并不是 "obvious" 使用 is 会失败。

例如

def foo():
    return (1, 2)

print(foo() is foo())

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

元组不被视为实体,而是值。不应使用值的标识,因为它可能匹配或不匹配(例如字符串或数字)。

如果在上面的代码中使用 [1, 2] 而不是 (1, 2) 那么可以保证 is 将 return False 因为列表是实体,而不是价值观和身份可以以可预测的方式使用。

另一个建议,使用列表理解来检查 is None 的所有 return 值:

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