Проблема здесь не functools.lru_cache
, это на самом деле ConfigParser. ConfigParser
наследуется от RawConfigParser
, который в Python 3x наследуется от collections.abc.MutableMapping
. Абстрактный класс MutableMapping
не является хэшируемым, так как он изменчив и не реализует магический метод __hash__
.
Поскольку экземпляр ConfigParser
не является хэшируемым, его нельзя использовать в качестве ключа длякеш-словарь в декораторе functools.lru_cache
.
Для получения дополнительной информации см. этот раздел документации configparser .
Предполагая, что необходимо кэшировать содержимоефайл конфигурации, другой вариант - прочитать содержимое файла, а затем передать строку содержимого в кэшированную функцию, например:
import functools
from configparser import ConfigParser as SafeConfigParser
path = "./conf/services.ini"
config_contents = open(path).read()
@functools.lru_cache(maxsize=32)
def build_api_params_key(config_contents: str):
"""Build the api url and return with key."""
config = SafeConfigParser()
config.read_string(config_contents)
api_url = config.get('translate', 'api_url')
api_version = config.get('translate', 'api_version')
api_key = config.get('translate', 'api_key')
full_api_url = api_url + api_version
return api_key
В приведенном выше решении файл конфигурации читается для получения строкисодержащий его содержимое. Поскольку строки можно хэшировать, это можно передать в кэшированную функцию. Вы также можете сделать нечто подобное с указателем файла, если вы предпочитаете читать содержимое файла внутри функции. Однако эти решения не совместимы с Python 2.7, так как read_string
не определено.