首页 > 解决方案 > 覆盖模拟对象的“is”运算符

问题描述

简化代码:我有一个函数,它需要一个数字或 None,True如果它是,则返回NoneFalse如果它是一个数字,例如:

def function(var):
    return var is None

我想传递一个模拟对象并使用这样的is运算符对其进行测试:

from unittest.mock import Mock

mock = Mock(return_value=None)
assert function()

尽管我将值嘲笑为 ,但这将失败None。根据文档,有许多受支持的魔术方法,但没有一个让我实现这种情况的行为。

更改为assert mock == None可以让我使用__eq__运算符,但我不想触摸代码(显然使用is==根据这个答案更快)

标签: pythonmockingoverridingpython-unittestpython-unittest.mock

解决方案


正如许多人指出的那样,is它是“不可替代的”,因为它是对 id 的快速相等检查。这就是为什么与__eq__.

更多关于这个的文档这个答案的评论。


推荐阅读