python - 防止评估现有键的dictionary.get或dictionary.setdefault中的默认函数

标签 python dictionary

我想跟踪我已经在字典中处理过的键值对(或者其他更好的东西),其中key是一些输入和值是某些复杂函数/计算的返回输出。主要目的是,如果我希望获取以前见过的键的值,则可以防止再次执行相同的过程。我尝试使用 setdefaultget 来解决这个问题,但是无论字典中是否存在该键,我调用的函数最终都会被执行。

示例代码:

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/

相关文章:

python - 实体检测 - 与英文单词冲突的实体

python - Python 中的字典分组和聚合列表

python - 用另一个列表遍历一个列表

python - 重用封装在类中的变量和模型

python - 在 PyPi 包页面上的重组文本中嵌入 HTML

python - 如何在不导入 RAM 的情况下使用 numpy 文件?

Python 字典语法错误 [学习 python 的困难方法 -ex39]

python - 合并字典内的列表值

javascript - 您可以使用 Array.map 来根据条件摆脱它所作用的元素吗?

python - 如何修复 Django 中的 "Forbidden (403) CSRF verification failed. Request aborted."错误