我有一个函数,可以返回两个整数的元组或(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
单元测试来测试该功能。人们总是说应该将None
与is
进行比较,但这显然行不通:
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?
答案 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))