我想跟踪我已经在字典中处理过的键值
对(或者其他更好的东西),其中key
是一些输入和值是某些复杂函数/计算的返回输出。主要目的是,如果我希望获取以前见过的键的值,则可以防止再次执行相同的过程。我尝试使用 setdefault
和 get
来解决这个问题,但是无论字典中是否存在该键,我调用的函数最终都会被执行。
示例代码:
def complex_function(some_key):
"""
Complex calculations using some_key
"""
return some_value
# Get my_key's value in my_dict. If my_key has not been seen yet,
# calculate its value and set it to my_dict[my_key]
my_value = my_dict.setdefault(my_key, complex_function(my_key))
无论 my_key
是否在 my_dict
中,complex_function
最终都会被执行。我还尝试使用 my_dict.get(my_key, complex_function(my_key))
得到相同的结果。目前,这是我的固定解决方案:
if my_key not in my_dict:
my_dict[my_key] = complex_function(my_key)
my_value = my_dict[my_key]
这是我的问题。首先,为此目的使用字典是正确的方法吗?其次,我是否正确使用了 setdefault
?第三,我当前的修复是否可以很好地解决问题? (如果 my_key
不存在,我最终会调用 my_dict[my_key]
两次)
最佳答案
所以我继续接受 Vincent 使用装饰器的建议。
新修复如下:
import functools
@functools.lru_cache(maxsize=16)
def complex_function(some_input):
"""
Complex calculations using some_input
"""
return some_value
my_value = complex_function(some_input)
据我所知,lru_cache
使用字典来缓存结果。此字典中的 key
指的是修饰函数 (some_input
) 的参数,value
指的是修饰函数的返回值函数(some_value
)。因此,如果使用之前传递过的参数调用该函数,它只会返回装饰器字典中引用的值,而不是运行该函数。如果没有看到参数,函数将照常进行,此外,装饰器会在其字典中创建一个新的键值对。
我暂时将 maxsize
设置为 16,因为我不希望 some_input
表示超过 10 个唯一值。需要注意的一件事是,装饰函数的参数必须是不可变且可散列的,因为它使用参数作为其字典的键。
关于python - 防止评估现有键的dictionary.get或dictionary.setdefault中的默认函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34401793/