On 9/22/2016 10:54 PM, Chris Angelico wrote:
On Fri, Sep 23, 2016 at 12:35 PM, Steven D'Aprano <st...@pearwood.info> wrote:
The straight-forward and simple way of writing a recursive spam()
function surprises beginners, but they might go years or their entire
career without running into a situation where they are caught by
surprise. After all, it is rare for productuon code to rename functions,
and rarer still to do it to recursive functions:
func = spam
spam = something_else()
func() # why does the recursion not work???
In production code, that sort of thing almost never happens.
There's actually one very common technique involving rebinding functions.
@count_calls
def mergesort(lst):
mid = len(lst) // 2
if not mid: return lst
return merge(mergesort(lst[..mid]), mergesort(lst[mid..]))
*Obviously* this is recursive. But if you used some magic that said
"call the function that's currently being called", you'd be bypassing
the count_calls decoration (which would presumably work by creating a
wrapper function). Yes, it may defeat some potential optimizations (eg
tail recursion optimization), but it enables all this flexibility.
@memoize is another decorator that depends on recursion by name.
So we _need_ to have this kind of rebind available, and not just for experts.
In the meantime, I'll usually just write my recursive functions the
old-fashioned normal way.
As will I. Of course, people are welcome to work differently, just as
long as I never have to write tests for their code, or refactor
anything into a decorator, or anything like that. I want the
POWAH!!!!! :)
ChrisA
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/
--
Terry Jan Reedy
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/