我应该只使用 `==` 来比较 `(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
单元测试来测试这个功能。总是说应该用 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?
你应该使用 ==
,但实际上并不是 "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))
我有一个函数,它可以 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
单元测试来测试这个功能。总是说应该用 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?
你应该使用 ==
,但实际上并不是 "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))