可调用作为dict.get的默认参数,如果密钥存在则不调用它

Pau*_*ulo 8 python dictionary

我试图提供一个函数作为字典的get函数的默认参数,就像这样

def run():
   print "RUNNING"

test = {'store':1}
test.get('store', run())
Run Code Online (Sandbox Code Playgroud)

但是,运行此命令时,它将显示以下输出:

RUNNING
   1
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,正如标题所说,有一种方法可以提供一个callable作为get方法的默认值,如果密钥存在则不调用它?

Eri*_*ric 9

另一个选项,假设您不打算在字典中存储有价值的值:

test.get('store') or run()
Run Code Online (Sandbox Code Playgroud)

在python中,or运算符不评估不需要的参数(它短路)

  • 简短而甜蜜。完美的 (2认同)

agf*_*agf 7

请参阅dict.get()方法的答案和注释中的讨论,返回一个指针.你必须分成两步.

你的选择是:

  1. defaultdict如果您始终希望将该值作为默认值,并且希望将其存储在dict.中,请使用with callable .

  2. 使用条件表达式:

    item = test['store'] if 'store' in test else run()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用try/ except:

    try:
        item = test['store']
    except KeyError:
        item = run()
    
    Run Code Online (Sandbox Code Playgroud)
  4. 用途get:

    item = test.get('store')
    if item is None:
        item = run()
    
    Run Code Online (Sandbox Code Playgroud)

这些主题的变化.

glglgl显示了一种子类的方法defaultdict,你也可以dict在某些情况下进行子类化:

def run():
    print "RUNNING"
    return 1

class dict_nokeyerror(dict):
    def __missing__(self, key):
        return run()

test = dict_nokeyerror()

print test['a']
# RUNNING
# 1
Run Code Online (Sandbox Code Playgroud)

如果你总是希望dict有一些非标准的行为,那么子类化才真正有意义; 如果你通常希望它表现得像一个正常dict而只是想get在一个地方懒惰,请使用我的方法之一2-4.