Alexander Oblovatniy added the comment:

Hi!

Current implementation of `patch.dict` spoils order of items in 
`collections.OrderedDict`, because it explicitly converts passed `values` to 
`dict` 
(https://github.com/python/cpython/blob/923527f560acd43d4cc11293060900e56c7cb39b/Lib/unittest/mock.py#L1559-L1560):

    # support any argument supported by dict(...) constructor
    self.values = dict(values)


Most obvious way is to check if `values` is an instance of `dict`. If it's not, 
then we need to convert it to dict:

    if not isinstance(values, dict):
        values = dict(values)

    self.values = values


This will work for `OrderedDict`, because it's a subclass of `dict`. But this 
will not work for `UserDict.UserDict`, `UserDict.DictMixin`, 
`collections.MutableMapping`, etc., because they do not subclass `dict`. So, 
better way is to less strict check and look if `values` implements `dict`-like 
interface, e.g.:

    if not hasattr(values, 'update'):
        values = dict(values)

    self.values = values


Here is a question existence of what attrs to check.

Any ideas?

Thanks!

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue24928>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to