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