[英]Namedtuple and tuple comparison difference between python2.7 and python3.5
This code works with python 3.5 but not with 2.7. 此代码适用于python 3.5,但不适用于2.7。
I'm trying to match a namedtuple by using a regular tuple containing the mock.ANY
special object. 我试图通过使用包含mock.ANY
对象的常规元组来匹配mock.ANY
。
try:
import unittest.mock as mock # python 3.5
except:
import mock # python 2.7
def test_datetime():
from collections import namedtuple
from datetime import datetime
A = namedtuple("A", ["a", "b"])
now = datetime.utcnow()
def foo(a):
a.bar(A(now, "b"))
a = mock.MagicMock()
foo(a)
a.bar.assert_called_once_with((mock.ANY, "b"))
if __name__ == "__main__":
print("Testing")
test_datetime()
How can I make it work in python 2.7 as well? 我怎样才能使其在python 2.7中正常工作? What's the reason for that? 是什么原因呢?
I can't change interpreter version 我无法更改解释器版本
EDIT : 编辑 :
Further reduced to 进一步减少到
try:
import unittest.mock as mock # python 3.5
except:
import mock # python 2.7
from collections import namedtuple
from datetime import datetime
now = datetime.now()
A = namedtuple("A", ["a"])
(mock.ANY,)==A(now) # False in py2.7, true in py3.5
For some reason mock is seeing tuples and namedtuples as different objects. 由于某种原因,模拟将元组和namedtuple视为不同的对象。 The following code passes for me in python 2.7 以下代码在python 2.7中为我传递
>>> def test_datetime():
... from collections import namedtuple
... from datetime import datetime
... A = namedtuple("A", ["a", "b"])
... now = datetime.utcnow()
... def foo(a):
... a.bar(A(now, "b"))
... a = mock.MagicMock()
... foo(a)
... a.bar.assert_called_once_with(A(mock.ANY, "b"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.