Python Glossary English

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Сообщить о неточности