[英]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.