Выставление `defaultdict` как обычного` dict`

я используюdefaultdict(set) заполнить внутреннее отображение в очень большой структуре данных. После этого'После заполнения вся структура (включая отображение) предоставляется клиентскому коду. В этот момент я нене хочу, чтобы кто-нибудь изменил отображение.

И никто не делает, намеренно. Но иногда клиентский код может случайно обратиться к элементу, который нене существует. В этот момент нормальный словарь поднял быKeyError, но так как отображениеdefaultdict, он просто создает новый элемент (пустой набор) в этом ключе. Это довольно сложно уловить, так как все происходит тихо. Но я должен убедиться, что это нене бывает (семантика на самом деле нет, но отображение увеличивается до огромных размеров).

Что я должен делать? Я вижу эти варианты:

Найдите все экземпляры в текущем и будущем клиентском коде, где выполняется поиск по словарю для сопоставления, и преобразуйте его вmapping.get(k, {}) вместо. Это просто ужасно ".

Замораживание» defaultdict после полной инициализации структуры данных, преобразовав ее вdict, (Я знаю это'на самом деле не заморожены, но я доверяю клиентскому коду, чтобы на самом деле не писатьmapping[k] = v.) Нелегкий и большой удар по производительности.

Заворачиватьdefaultdict вdict интерфейс. Какие'элегантный способ сделать это? Я'Боюсь, что производительность может быть огромной (этот поиск интенсивно используется в тесных циклах).

Подклассdefaultdict и добавить метод, который "выключается" всеdefaultdict особенности, оставляя его вести себя так, как будто эторегулярныйdict, Это'с вариантом 3 выше, но яя не уверен, если этобыстрее. И я нене знаю, если этовыполнимо, не полагаясь на детали реализации.

Используйте регулярныеdict в структуре данных, переписав весь код, чтобы сначала проверить, есть ли элемент в словаре, и добавив его, если оннет. Нехорошо.

Ответы на вопрос(3)

Ваш ответ на вопрос