如果从函数返回v,为什么D.get(k,v)似乎总是执行v?

时间:2015-03-21 17:32:58

标签: python

D = {'a':1}
D.get('a', print('hah'))

虽然1成功归还,但我也得到了#ha;'为什么?似乎python需要评估它应该返回的内容,如果' a'不存在,并且以某种方式被欺骗,因为它只期望变量。

此外,是否有一种聪明的方法来获得预期的行为(不执行打印功能),除此之外:

D.get('a', print('hah') if not D.get('a') else None)

请注意,这里的print()是一个MWE。我真的需要使用一个返回列表的函数。

4 个答案:

答案 0 :(得分:5)

当python调用一个函数时,首先会计算所有参数,因为python不知道是否需要一个参数。

如果您不想进行评估,则必须使用if或例外:

D = {'a': 1}
try:
    a = D['a']
except KeyError:
    a = print('hah')

有两个查找,所以不那么优雅:

a = D['a'] if 'a' in D else print('hah')

或者,如果您可以保证,您字典中的值永远不会评估为False(没有空字符串,空元组,0,0.0,...,要谨慎!) :

a = D.get('a') or print('hah')

答案 1 :(得分:2)

是的,python 首先评估参数,然后调用该函数。

打印get的结果:

print(D.get('a', 'hah'))

或者,如果你想检查存在:

if "a" in D:
    print('there')

答案 2 :(得分:2)

Python不是懒惰的评估。所以你的

D.get('a', <function call that returns None>)

首先评估提供给get的函数,然后进行查找。如果'a'不在字典中,您仍然会收到打印的语句,但get调用将返回None

当然,你可以通过使用函数而不是值来设计像python的延迟评估之类的东西:

d = {'a': lambda x: 1}
d.get('a', lambda x: print('hah'))('dummy function argument')

但这种尴尬应该是不言而喻的。我想每个人都会同意这是“unpythonic”。可以说是更好的方式是:

def return1():
    return 1

def print_hah():
    print('hah')

d = {'a': return1}
d.get('a', print_hah)()

但同样,这不是很漂亮。主要问题是python并不是真正的功能语言;你可以做到,它只是看起来不太好。

答案 3 :(得分:0)

删除print部分:

D = {'a': 1}
print(D.get('a', 'hah'))