簡體   English   中英

python 2 和 python 3 中的“functools.lru_cache”有什么變化嗎?

[英]Any changes in 'functools.lru_cache' from python 2 and python 3?

我的代碼在python2.7中運行良好,但在python 3 functools.lru_cache(maxsize=32)中從 python 2 到 python 3 的任何更改都失敗了。

我得到的錯誤是我的configparser object 在functools.lru_cache緩存時說

TypeError: unhashable type: 'ConfigParser'

想了解 python 2 和 python 3 中'functools.lru_cache'的變化嗎?

#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

這里的問題不是functools.lru_cache ,它實際上是 ConfigParser。 ConfigParser繼承自RawConfigParser ,在 Python 3x 中,繼承自collections.abc.MutableMapping MutableMapping抽象 class 不可散列,因為它是可變的並且不實現__hash__魔術方法。

由於ConfigParser實例不可散列,因此它不能用作functools.lru_cache裝飾器中緩存字典的鍵。

如需進一步參考,請參閱configparser 文檔的這一部分

假設需要緩存配置文件的內容,另一種選擇是讀取文件的內容,然后將內容字符串傳遞給緩存的 function,就像這樣

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

在上面的解決方案中,讀取配置文件以獲取包含其內容的字符串。 由於字符串是可散列的,因此可以將其傳遞給緩存的 function。 如果您希望讀取 function 中的文件內容,也可以對文件指針執行類似的操作。 但是,這些解決方案與 Python 2.7 不兼容,因為未定義read_string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM