Return twice in a python function
Posted | archive
1.py:
def foo():
try:
return 'foo'
finally:
return 'bar'
print foo()
2.py
def foo():
try:
return 'foo'
finally:
print 'bar'
print foo()
The result is shocking...
$ python 1.py
bar
$ python 2.py
bar
foo
I think this particular behavior is well abused in WSGI
two cents:
return
does not actually leave the function immediately- a function without
return
statement returns None, but explicitly return None is not the same.None
is the most abused thing in all programming languages.
to quote the official doc:
When return passes control out of a try statement with a finally clause, that finally clause is executed before really leaving the function.
In a generator function, the return statement is not allowed to include an expression_list. In that context, a bare return indicates that the generator is done and will cause StopIteration to be raised.
As to yield
:
As of Python version 2.5, the yield statement is now allowed in the try clause of a try ... finally construct. If the generator is not resumed before it is finalized (by reaching a zero reference count or by being garbage collected), the generator-iterator’s close() method will be called, allowing any pending finally clauses to execute.
Black magic!
Comments