我正在查看this list of python quirks并感到很有趣,因为这会返回False
:
def t():
try:
return True
finally:
return False
看到这个后,我看到了答案here和here,它们说明了原因,那就是finally
子句将永远执行,没有例外。
我的问题是,以前存储的return
值在哪里:
def t():
try:
return True
finally:
...
为什么不返回None
而是返回原始True
?
是否可以以编程方式访问将要返回的值?
def t():
try:
return True
finally:
...
# if returning != None: return False
我想知道是否可以在不使用变量的情况下执行此操作,例如:
def t():
retval = None
try:
retval = "Set"
finally:
if retval != None:
return retval
else:
return "Not Set"
和
def t():
retval = None
try:
...
finally:
if retval != None:
return retval
else:
return "Not Set"
分别返回'Set'
和'Not Set'
。
答案 0 :(得分:3)
为什么不返回
None
而是返回原始True
?
来自docs:
当通过
finally
,break
或continue
语句留下try语句的任何其他子句时,return
子句也会在“出路”上执行。
所以这意味着如果return
子句中存在finally
语句将返回该值(因为finally
块保证完全执行,所以return
其中的语句也将被执行)。否则,如果try/except
块将返回一个值,则返回该值。
这意味着
def t():
try:
print("Inside try")
return "Return from try"
finally:
print("Inside finally")
return "Return from finally"
将完全执行:
def t():
try:
print("Inside try")
# start of old finally block, executed "on the way out"
print("Inside finally")
return "Return from finally"
# end of old finally block, inserted right before return statement in try
return "Return from try"
finally:
pass
是否可以以编程方式访问将要返回的值?
不,您无法在代码的其他部分中访问return
语句之后的值而不保存它。