Выставление `defaultdict` как обычного` dict`
я используюdefaultdict(set)
заполнить внутреннее отображение в очень большой структуре данных. После этого'После заполнения вся структура (включая отображение) предоставляется клиентскому коду. В этот момент я нене хочу, чтобы кто-нибудь изменил отображение.
И никто не делает, намеренно. Но иногда клиентский код может случайно обратиться к элементу, который нене существует. В этот момент нормальный словарь поднял быKeyError
, но так как отображениеdefaultdict
, он просто создает новый элемент (пустой набор) в этом ключе. Это довольно сложно уловить, так как все происходит тихо. Но я должен убедиться, что это нене бывает (семантика на самом деле нет, но отображение увеличивается до огромных размеров).
Что я должен делать? Я вижу эти варианты:
Найдите все экземпляры в текущем и будущем клиентском коде, где выполняется поиск по словарю для сопоставления, и преобразуйте его вmapping.get(k, {})
вместо. Это просто ужасно ".
Замораживание» defaultdict
после полной инициализации структуры данных, преобразовав ее вdict
, (Я знаю это'на самом деле не заморожены, но я доверяю клиентскому коду, чтобы на самом деле не писатьmapping[k] = v
.) Нелегкий и большой удар по производительности.
Заворачиватьdefaultdict
вdict
интерфейс. Какие'элегантный способ сделать это? Я'Боюсь, что производительность может быть огромной (этот поиск интенсивно используется в тесных циклах).
Подклассdefaultdict
и добавить метод, который "выключается" всеdefaultdict
особенности, оставляя его вести себя так, как будто эторегулярныйdict
, Это'с вариантом 3 выше, но яя не уверен, если этобыстрее. И я нене знаю, если этовыполнимо, не полагаясь на детали реализации.
Используйте регулярныеdict
в структуре данных, переписав весь код, чтобы сначала проверить, есть ли элемент в словаре, и добавив его, если оннет. Нехорошо.