2012-04-19 3 views
11

Я работаю с xlwt, который имеет ограничение 4k на то, сколько стилей можно определить в документе excel.Как хэш * args ** kwargs для кеша функции?

Обычно, один создает стиль, как так:

style = xlwt.easyxf("font: bold 1") 

который я просто заменен

def cached_easyxf(self, format): 
    return self._cache.setdefault(format, xlwt.easyxf(format)) 

, который работает отлично. Теперь я выяснил, что мне нужно иногда передавать аргументы ключевых слов, которые заставили меня задуматься: как я должен хэшировать подпись args/kwargs?

Должен ли я создать ключ кеша на основе str (значение)? Соленый огурец? Что является самым надежным?

Для моей ситуации это выглядит как я могу просто преобразовать ключ/значение строк и добавить его в мои ключи ... но я теперь интересно родовой способом справиться с этим с сказать unhashable типа как arg=[1, 2, 3]

def cached_call(*args, **kwargs): 
    return cache.get(what_here) 
cached_call('hello') 
cached_call([1, 2, 3], {'1': True}) 

ответ

10

Вот это метод, используемый в functools.lru_cache():

kwd_mark = object()  # sentinel for separating args from kwargs 

def cached_call(*args, **kwargs): 
    key = args + (kwd_mark,) + tuple(sorted(kwargs.items())) 
    return cache.get(key) 

Обратите внимание, приведенный выше код обрабатывает ключевые аргументы, но не делает никаких попыток справиться без hashable значения, как списки. Идея использования списка str является разумным началом. Для set объектов, вам необходимо отсортировать записи сначала, str(sorted(someset)). Другие объекты могут не иметь полезного __repr__ или __str__ (то есть они могут отображать только тип объекта и местоположение в памяти). Таким образом, обработка произвольных нерасходованных аргументов требует тщательного рассмотрения каждого типа объекта.

+1

Спасибо за ответ Раймонд! Очень ценится –

+0

Будет ли следующая работа так же: 'key = (args, tuple (sorted (kwds.items())))'? Или это медленнее из-за внутренних кортежей? – max

+0

@max Да, это сработает. И да, дополнительные указатели замедлят его, а также потребляют немного больше памяти. –

Смежные вопросы