【发布时间】:2021-01-27 15:13:59
【问题描述】:
简化代码:我有一个函数,它需要一个数字或 None,如果是 None,则返回 True,如果是数字,则返回 False,例如:
def function(var):
return var is None
我想传递一个模拟对象并使用is 运算符对其进行测试,如下所示:
from unittest.mock import Mock
mock = Mock(return_value=None)
assert function()
尽管我将值嘲笑为None,但这将失败。根据documentation,支持的魔术方法有很多,但没有一个让我实现这种情况下的行为。
更改为assert mock == None 可以让我使用__eq__ 运算符,但我不想接触代码(根据this answer,显然使用is 比== 快)
【问题讨论】:
-
您无法更改
is -
你怎么能说
is如果你想同时实现两者会更快? -
"更改为 assert mock == None 会让我使用 eq 运算符,但我想避免它,因为显然使用 is 比 == 根据 this回答。”这不会是一个重大的性能问题
-
@juanpa.arrivillaga: 可能不是性能问题,但性能有差异 >>> timeit.Timer("None == None").timeit() 0.026401887999782048 >>> timeit.Timer ("None is None").timeit() 0.02391680099935911 顺便说一句,这些是平均值
-
@ezib 因为该语言没有为
is提供钩子,这总是意味着身份。
标签: python mocking overriding python-unittest python-unittest.mock