Можно ли извлечь упакованное отображение из экземпляра MappingProxyType? - PullRequest
0 голосов
/ 04 февраля 2020

Есть ли какой-нибудь кроссплатформенный способ получить ссылку на какой-либо объект сопоставления, имея MappingProxyType экземпляр этого сопоставления?

>>> class A: pass
>>> A.__dict__ # is there a way to get the wrapped dict of this proxy?
mappingproxy({'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})

или

>>> import types
>>> m = {1: 2}
>>> mp = types.MappingProxyType(m) # how to extract m from mp?

1 Ответ

2 голосов
/ 04 февраля 2020

MappingProxyType походит на dict, где метод __setattr__ всегда будет выдавать ошибку. По замыслу вы не можете добавлять новые пары ключ / значение. Однако вы можете получить мелкую копию его содержимого в обычном словаре.

Предполагая, что у вас есть сопоставляющий прокси ...

import types

# Given a normal dictionary...
dictionary = {
  "foo": 10,
  "bar": 20,
}

# That has been wrapped in a mapping proxy...
proxy = types.MappingProxyType(dictionary)

# That cannot accept new key/value pairs...
proxy["baz"] = 30 # Throws TypeError: 'mappingproxy' object does not support item assignment

Вы можете создать мелкая копия его внутреннего словаря, например, так:

dictionary_copy = proxy.copy()

print(type(dictionary_copy))         # Prints "<class 'dict'>"
print(dictionary_copy is dictionary) # Prints "False" because it's a copy

dictionary_copy["baz"] = 30          # Doesn't throw any errors

Насколько я знаю, нет способа извлечь исходный словарь или добавить новые пары ключ / значение без создания сначала копия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...