Как создать вложенный словарь Python, который имеет разные уровни вложенности и все листовые ключи имеют одинаковое значение - PullRequest
0 голосов
/ 10 апреля 2019

Я рефакторинг кода спагетти, и он имеет такой кусок:

template_dict = {
    "value": "",
    "isIncreased": False,
    "isDecreased": False
}
my_dict = {
    "current_half_result": {
        "home": template_dict,
        "draw": template_dict,
        "away": template_dict
    },
    "full_time_result": {
        "home": template_dict,
        "draw": template_dict,
        "away": template_dict
    },
    "current_half_over_under": {
        "$1_5": {
            "over": template_dict,
            "under": template_dict
        },
        "handicap": ""
    },
    "full_time_over_under": {
        "$2_5": {
            "over": template_dict,
            "under": template_dict
        },
        "handicap": ""
    },
    "next_goal": {
        "home": template_dict,
        "no_goal": template_dict,
        "away": template_dict
    }
}

Как видите, переменная my_dict имеет одинаковое значение во всех листовых ключах - template_dict. Как я могу удалить повторение из кода таким образом, чтобы код не работал медленнее, чем текущий пример, а также повысить читабельность и чистоту кода. Скорость является важным фактором, потому что этот кусок кода получает 3-6 сотен раз в секунду на моем сервере. И я не хочу увеличивать количество строк или создавать дополнительные функции и т. Д.

P.S. Я не писал этот код, так что не судите меня. Из-за сильной связи в коде, я не могу сделать большие изменения сразу. Для полного кода, проверьте эту ссылку

1 Ответ

0 голосов
/ 10 апреля 2019

Вот мое собственное решение.

def_dict = defaultdict(lambda: {"value": "", "isIncreased": False, "isDecreased": False})
my_dict = defaultdict(lambda: def_dict)
# PyCharm raises warning for two lines below, but it works
my_dict['current_half_over_under'] = defaultdict(lambda: def_dict) 
my_dict['full_time_over_under'] = defaultdict(lambda: def_dict)

И для установки "handicap" ключей в словарях "full_time_over_under" и "current_half_over_under" мы должны получить к нему доступ через my_dict.setdefault('handicap', some_value)

...