函数执行字典中是否存在键或在python 2.7中获取

时间:2018-10-30 05:48:42

标签: python dictionary

我正在使用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; DR

我的问题是,如果字典中存在键,为什么函数会被执行?

是我做错了什么,还是我想念这里?

1 个答案:

答案 0 :(得分:4)

my_dictionary_object.get("key", my_function())中,执行类似于:

  • 计算第一个参数(“键”)
  • 计算第二个参数,它是一个表达式:my_function()。因此,让我们调用该函数,并在其位置使用返回值。就像在a = my_function()中一样,python会调用该函数并将返回的值放在其位置。
  • 使用上面两个已评估的参数调用mydictionary_object.get(..)

换句话说,如果键不存在,dictionary.get("key", default)将仅返回第二个参数。如果它是lambda,则返回lambda。 Lambda是一个对象。请注意,在.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"]