Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: cache, hashable

Как обрабатывать аргументы функции в кэше, если они могут быть нехэшируемыми?

Вопрос проверяет понимание ограничений кэширования и способов приведения аргументов к хэшируемому виду.

Короткий ответ

Если аргументы функции нехэшируемые (например, списки или словари), их нельзя напрямую использовать как ключ кэша. Обычно их преобразуют в хэшируемый вид: список в кортеж, словарь в frozenset или сериализованную строку. В более сложных случаях используют кастомную функцию нормализации аргументов. Главное — обеспечить стабильное представление аргументов.

Длинный ответ

Кэш обычно реализуется на основе словаря, а ключи словаря должны быть хэшируемыми. Поэтому аргументы функции необходимо преобразовать в хэшируемую форму.

Основные способы решения

  1. Приведение к неизменяемым типам

Чаще всего используется преобразование:

  • list → tuple

  • set → frozenset

  • dict → tuple(sorted(dict.items()))

Пример:

def make_hashable(obj):
    if isinstance(obj, list):
        return tuple(make_hashable(i) for i in obj)
    if isinstance(obj, dict):
        return tuple(sorted((k, make_hashable(v)) for k, v in obj.items()))
    return obj
  1. Сериализация аргументов

Можно преобразовать аргументы в строку:

import json

key = json.dumps(args, sort_keys=True)

Этот подход удобен, но медленнее.

  1. Ограничение интерфейса

Иногда проще явно требовать, чтобы аргументы функции были хэшируемыми.

Важные требования

При преобразовании аргументов нужно обеспечить:

  • детерминированность

  • одинаковый ключ для одинаковых значений

  • независимость от порядка словарей

Вывод

Если аргументы нехэшируемые, их необходимо нормализовать в неизменяемую форму или сериализовать. Это стандартная практика при реализации универсальных кэшей.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Python

    Python

Ключевые слова

#cache

#hashable

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.