Используйте dict_proxy._getvalue()
для получения фактического dict
экземпляра, лежащего в основе прокси, и передайте его json.dump
(или любым другим способом, который вы используете).
>>> import multiprocessing
>>> m = multiprocessing.Manager()
>>> d = m.dict()
>>> import json
>>> json.dumps(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/json/__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "/usr/lib64/python2.6/json/encoder.py", line 367, in encode
chunks = list(self.iterencode(o))
File "/usr/lib64/python2.6/json/encoder.py", line 317, in _iterencode
for chunk in self._iterencode_default(o, markers):
File "/usr/lib64/python2.6/json/encoder.py", line 323, in _iterencode_default
newobj = self.default(o)
File "/usr/lib64/python2.6/json/encoder.py", line 344, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <DictProxy object, typeid 'dict' at 0x97eed0> is not JSON serializable
>>> json.dumps(d._getvalue())
'{}'
Несмотря на соглашение об именах, '_getvalue()' документируется, поэтому он не является частным. Это также единственный вариант для объектов, у которых нет метода 'copy', хотя' copy' отлично работает для случая 'dict'. – dano
@dano: Документировано ≠ Public – martineau
Разработчики Core Python заявили, что документированные части API являются фактически публичным API (https://mail.python.org/pipermail/python-dev/2010-November/105667. HTML). – dano