简体   繁体   English

python2.7和python3.5之间的nameddtuple和tuple比较差异

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM