Никто и не говорит, что есть проблема )
Насколько я понял изначальные условия сей ишью - нужно иметь механизм установки дефолтного значения для словаря некоторой структуры.
И вариантов действительно 100500!
Всё зависит от потребностей.
1) Простой словарь с единичным уровнем вложенности ключей.
Вариантов предложили массу, начиная от использования .get(), .update(), .setdefault() - выбирай любой!
Какие-то варианты потребуется везде по коду юзать. Это я про .get() и .setdefault(). Это нехорошо потому как логика алгоритма будет “размазываться” логикой доступа к ключам.
Варианты с .update() будет интересен при инстанцировании. Профит в атомарности и разовости такой операции.
2) Более сложный вариант с известной структурой и известным уровнем вложенности. Подойдут те же операции, что обозначены выше. Нужно будет позаботиться только о том, чтобы при создании под-словаря передать ему необходимое дефолтное значение.
3) Обобщённый вариант: есть некая структура дефолтных значений произвольной вложенности. Вот тут будут интересны вариации DeepDict, предложенные FishHook (сам что-то похожее велосипедил). Чем хорош этот подход: логика доступа к ключам (и вложенным) будет инкапсулирована в недрах класса, и в месте использования не придётся “разбодяживать” основной алгоритм разного рода проверками - ты просто обращается к ключу и будешь уверен, что получишь дефолтное значение.
Что же касается новых фишечек, то тут очень сильно зависит от степени “старости” проекта и зависимостях на внешние пакеты. Далеко не все проекты могут похвастаться использованием в проде пайтона версии даже 3.5 с async def вместо @coroutine и прочими новшествами (async for сюда же)