首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python2和Python3中'functools.lru_cache‘有什么变化吗?

在Python2和Python3中'functools.lru_cache‘有什么变化吗?
EN

Stack Overflow用户
提问于 2019-11-07 20:56:08
回答 1查看 733关注 0票数 0

我的代码在python2.7中运行良好,但在python 3 functools.lru_cache(maxsize=32)中,从Python2到Python3的任何更改都失败。

我得到的错误是在functools.lru_cache中缓存时我的configparser对象,它说

TypeError: unhashable type: 'ConfigParser'

想了解Python2和Python3在'functools.lru_cache'中的变化吗?

代码语言:javascript
运行
复制
#CONFI FILE
[translate]
api_url = https://url
api_version = version_num
api_key = key_value


#code goes here
import functools
from configparser import ConfigParser as SafeConfigParser
config = SafeConfigParser()
path ="./conf/services.ini"
config.read(path)


@functools.lru_cache(maxsize=32)
def build_api_params_key(config):
    """Build the api url and return with key."""
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 09:39:39

这里的问题不是functools.lru_cache,而是ConfigParser。ConfigParser继承自RawConfigParser,在Python3x中继承自collections.abc.MutableMappingMutableMapping抽象类是不可哈希的,因为它是可变的,并且没有实现__hash__魔术方法。

由于ConfigParser实例不可哈希,因此不能将其用作functools.lru_cache装饰器中缓存字典的键。

有关进一步的参考,请参阅this section of the configparser docs

假设有必要缓存配置文件的内容,另一种选择是读取文件的内容,然后将内容字符串传递给缓存的函数,如下所示

代码语言:javascript
运行
复制
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

在上面的解决方案中,读取配置文件以获取包含其内容的字符串。因为字符串是可散列的,所以可以将其传递给缓存函数。如果您更愿意在函数中读取文件的内容,也可以使用文件指针执行类似的操作。然而,这些解决方案与Python2.7不兼容,因为没有定义read_string

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58749254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档