2017-04-24 95 views
0

這段代碼適用於python 3.5,但不適用於2.7。python2.7和python3.5之間的名稱和元組比較區別

我想通過使用包含mock.ANY特殊對象的常規元組來匹配namedtuple。

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() 

我怎樣才能讓它在python 2.7中工作呢? 這是什麼原因?

我不能改變的翻譯版本

編輯

進一步降低到

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 

回答

0

出於某種原因,模擬是看到元組和namedtuples爲不同的對象。以下代碼在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")) 
相關問題