首页 > 解决方案 > 函数在python 2.7中执行dictionary.get中的键是否存在

问题描述

我正在使用 Python 中的字典,并且正在使用以下方法搜索值:

my_dictionary_object.get("key")

众所周知,如果字典中缺少键,它将返回None对象。因此,为了节省额外的行并使我的代码更有趣,我正在尝试:

def my_function():
    '''do some calculations'''
    return missing_value_from_dictionary 

现在这是有趣的部分;当我做

my_dictionary_object.get("key", my_function())

无论钥匙是否丢失,它都会执行该功能,所以我想让我们删除括号,我做了:

my_dictionary_object.get("key", my_function)

(以防万一)

my_dictionary_object.get("key", lambda: my_function())

但是没有 lambda 的那个没有执行(因为它从未被调用过)同样发生在有 lambda 的那个上。

TL;博士

我的问题是,如果字典中存在密钥,为什么要执行该函数?

是我做错了什么还是我在这里遗漏了什么?

标签: pythondictionary

解决方案


在:my_dictionary_object.get("key", my_function())执行看起来像:

  • 评估第一个参数(“key”)
  • 评估作为表达式的第二个参数:my_function(). 因此,让我们调用该函数,并使用返回值代替它。非常类似于: a = my_function(),python 会调用该函数并将返回的值放在它的位置。
  • mydictionary_object.get(..)使用上述两个评估参数调用。

换句话说,dictionary.get("key", default)如果键不存在,将简单地返回第二个参数。如果是 lambda,则返回 lambda。lambda 是一个对象。请注意, in .get("key", my_function())my_function()在技术上不是第二个参数。作为执行该函数的结果返回的结果值是第二个参数——它解释了你错在哪里,希望如此。


您要查找的内容实际上是在另一个名为defaultdict.

你要做的是:

from collections import defaultdict

my_dictionary_object = defaultdict(my_function)  # my_function should not take any argument.
my_dictionary_object["non-existing-key"]         # Magic happens, see below.

发生的情况是,如果键 (=x) 不存在,my_function则在没有任何参数的情况下调用字典,并使用函数针对键 (=x) 返回的值更新字典。就像是:

if "key" not in dictionary:
    dictionary["key"] = my_function()
    return dictionary["key"]

推荐阅读