Python 3.15+Встроенные функциипонятие
frozendict()
типы
Неизменяемый словарь: те же ключи и чтение, что у dict, но без изменения на месте. Хешируется, если хешируются ключи и значения.
Синтаксис
frozendict(**kwargs)
frozendict(mapping, /, **kwargs)
frozendict(iterable, /, **kwargs)
Главная польза — хешируемость: frozendict можно положить в set, сделать ключом другого словаря или аргументом функции под functools.cache, чего dict не позволяет. Методы изменения (d[k] = v, del, pop, update, setdefault, clear) отсутствуют — попытка записи даёт TypeError. Оператор | возвращает новый frozendict, а |= не меняет объект, а переназначает имя на новый. Это не подкласс dict: isinstance(fd, dict) ложно, зато frozendict — Mapping. Хешируемость неглубокая: frozendict со списком внутри создать можно, но hash() на нём падает с TypeError. До 3.15 похожую роль играл types.MappingProxyType — но это лишь вид на чужой dict, который меняется вместе с ним.
Примеры
fd = frozendict(host='localhost', port=8080)
print(fd['port']) # → 8080
print(fd) # → frozendict({'host': 'localhost', 'port': 8080})
try:
fd['port'] = 9090
except TypeError as e:
print(type(e).__name__) # → TypeError
configs = {frozendict(env='prod'): 'боевой', frozendict(env='dev'): 'отладка'}
print(configs[frozendict(env='dev')]) # → отладка
print(isinstance(frozendict(), dict)) # → False
base = frozendict(a=1)
more = base | {'b': 2}
print(more) # → frozendict({'a': 1, 'b': 2})
print(base) # → frozendict({'a': 1}) — исходный не изменился
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности