Полагаю, вы хотите, чтобы вызываемый объект применялся только в том случае, если ключ не существует.
Существует несколько подходов для этого.Можно было бы использовать defaultdict, который вызывает run()
, если ключ отсутствует.
from collections import defaultdict
def run():
print "RUNNING"
test = {'store':1}
test.get('store', run())
test = defaultdict(run, store=1) # provides a value for store
test['store'] # gets 1
test['runthatstuff'] # gets None
Другой, довольно уродливый, можно было бы сохранять только вызовы в dict, которые возвращают подходящее значение.
test = {'store': lambda:1}
test.get('store', run)() # -> 1
test.get('runrun', run)() # -> None, prints "RUNNING".
Если вы хотите, чтобы возвращаемое значение зависело от отсутствующего ключа, вы должны создать подкласс defaultdict:
class mydefaultdict(defaultdict):
def __missing__(self, key):
val = self[key] = self.default_factory(key)
return val
d = mydefaultdict(lambda k: k*k)
d[10] # yields 100
@mydefaultdict # decorators are fine
def d2(key):
return -key
d2[5] # yields -5
И если вы не хотите добавлять это значение в dict дляпри следующем вызове вместо этого
def __missing__(self, key): return self.default_factory(key)
, который вызывает фабрику по умолчанию каждый раз, когда пара key: value
не была явно добавлена.