Обновить все значения словаря с разными идентификаторами - PullRequest
1 голос
/ 18 февраля 2020

Я хочу создать автоматически сгенерированный шаблон словаря.

Формат словаря такой: {'google_drive': {'services': []}, 'dropbox': {'services': []}, 'test': {'services': []}}

Все ключи имеют одинаковое значение {'services': []} и их значения идентификаторы / адреса должно быть по-другому. Проблема теперь в том, что все значения одинаковы.

# init function has an array ["google_drive", "dropbox", "test"] 
# so that all the key-value pairs can be created automatically
test = CloudInfo().init().config_info
print(id(test["google_drive"]["services"]))
print(id(test["dropbox"]["services"]))
print(id(test["test"]["services"]))

Вывод

2382756081216
2382756081216
2382756081216

И я нашел проблему в моем инкапсулированном методе:

def update_all_value(self, keys, value):
    __keys = keys
    __dict = self.__dict
    __value = value
    if __keys is not None:
        for key in __keys:
            if key in __dict:
                __dict.update({key: __value})
        self.__dict = __dict
    return self

Все ключи указали на одну переменную __value.

Если я изменил __dict.update({key: __value}) на __dict.update({key: {'services': []}}), значения словаря - это разные идентификаторы. Но функция не может использоваться повторно.

Есть ли хорошее решение, которое может обновить все значения словаря с разными идентификаторами и сохранить входной параметр value работающим?

1 Ответ

1 голос
/ 18 февраля 2020

Вы можете использовать defaultdict:

from collections import defaultdict
import copy

template = {'services': []}
test = defaultdict(lambda: copy.deepcopy(template))
print(id(test["google_drive"]["services"]))
# 2546846465416
print(id(test["dropbox"]["services"]))
# 2546847840648
print(id(test["test"]["services"]))
# 2545171504392
...