我试图提供一个函数作为字典的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方法的默认值,如果密钥存在则不调用它?
另一个选项,假设您不打算在字典中存储有价值的值:
test.get('store') or run()
Run Code Online (Sandbox Code Playgroud)
在python中,or
运算符不评估不需要的参数(它短路)
请参阅dict.get()方法的答案和注释中的讨论,返回一个指针.你必须分成两步.
你的选择是:
defaultdict
如果您始终希望将该值作为默认值,并且希望将其存储在dict
.中,请使用with callable .
使用条件表达式:
item = test['store'] if 'store' in test else run()
Run Code Online (Sandbox Code Playgroud)使用try
/ except
:
try:
item = test['store']
except KeyError:
item = run()
Run Code Online (Sandbox Code Playgroud)用途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.