"return" in def

Bruno Desthuilliers bdesth.quelquechose at free.quelquepart.fr
Tue Dec 30 16:12:31 EST 2008


Steven D'Aprano a écrit :
(snip)
> Avoiding early exits is an over-reaction to the Bad Old Days of spaghetti 
> code. 

Mostly, yes. It can also be a way to help avoiding "resource leaks" 
(memory or whatever) - just like try/finally blocks or the 'with' 
statement in Python.

> But used wisely, early exists can simplify, not complicate, code.
> 
> Consider the following:
> 
> def find_ham(alist):
>     for item in alist:
>         if isinstance(item, Ham):
>             return item
>     raise ValueError('no ham found')
> 
> 
> def find_spam(alist):
>     found_item = None
>     for item in alist:
>         if found_item is not None:
>             if isinstance(item, Spam):
>                 found_item = item
>     if found_item is None:
>         raise ValueError('no spam found')
>     else:
>         return found_item
> 

> The second version has double the number of lines of code of the first. 

And doesn't do the same thing (hint: you forgot a break statement). Also 
and FWIW, the "single exit" golden rule (hem) comes from languages 
without exception handling. So a fair comparison would be:

def find_egg(alist):
    for item in alist:
        if isinstance(item, Egg):
            return item
    return None

vs:

def find_sausage(alist):
    found = None
    for item in alist:
        if isinstance(item, Sausage):
            found = item
            break
    return found

Granted, this still doesn't make the second version better than the 
first !-)

But:

> I  don't think the claim that the version with an early exit is more 
> complicated than the version without can justified.

Certainly not in this simple (simplistic ?) example. Now in C or Pascal, 
functions tend to be much longer and complicated, thanks to all the gory 
details one has to take care of.

Not that I'm advocating "no early return" as a "golden rule" - specially 
in Python where functions tend to be short and readable -, but there 
really are cases (depending on the language *and* concrete use case) 
where avoiding early returns makes for more readable and robust code.

My 2 cents...



More information about the Python-list mailing list