This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author xtreak
Recipients cjw296, mariocj89, michael.foord, xtreak
Date 2019-06-10.07:53:36
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1560153217.35.0.990763770677.issue37212@roundup.psfhosted.org>
In-reply-to
Content
With PEP 468 implemented in Python 3.6 the order of keyword arguments are preserved. In mock.call the arguments are sorted [0]. This makes the output different from the expectation that order should be same as the one passed. This was implemented in issue21256 where ordered kwargs was suggested but I guess it was not implemented and hence sort was used for deterministic output. The PEP also links to the discussion where ordered kwargs was discussed [1] in 2009 before ordered dict implementation.

Given that keyword argument dictionary is now deterministic is it okay to drop sorting in 3.9? This is backwards incompatible with 3.8 where code might have depended upon the sorted output so if this requires a python-dev discussion I would be happy to start one.


# (b=1, a=2) is the actual call but "actual" in error message is noted as (a=2, b=1)

>>> from unittest.mock import call, Mock
>>> call(b=1, a=2)
call(a=2, b=1)
>>> m = Mock()
>>> m(b=1, a=2)
<Mock name='mock()' id='4477750800'>
>>> m.assert_called_with(c=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/unittest/mock.py", line 870, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: expected call not found.
Expected: mock(c=3)
Actual: mock(a=2, b=1)

# With proposed change removing sorting

>>> from unittest.mock import call, Mock
>>> call(b=1, a=2)
call(b=1, a=2)
>>> m = Mock()
>>> m(b=1, a=2)
<Mock name='mock()' id='4419010880'>
>>> m.assert_called_with(c=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/unittest/mock.py", line 870, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: expected call not found.
Expected: mock(c=3)
Actual: mock(b=1, a=2)

[0] https://github.com/python/cpython/blob/c879ff247ae1b67a790ff98d2d59145302cd4e4e/Lib/unittest/mock.py#L2284
[1] https://mail.python.org/pipermail/python-ideas/2009-April/004163.html
History
Date User Action Args
2019-06-10 07:53:37xtreaksetrecipients: + xtreak, cjw296, michael.foord, mariocj89
2019-06-10 07:53:37xtreaksetmessageid: <1560153217.35.0.990763770677.issue37212@roundup.psfhosted.org>
2019-06-10 07:53:37xtreaklinkissue37212 messages
2019-06-10 07:53:36xtreakcreate