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。我真的需要使用一个返回列表的函数。
答案 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'))