Skip to main content

No more `RecursionError: maximum recursion depth exceeded`

Project description

precursion PyPI Python 2.7, 3.4, 3.5, 3.6

precursion – Python module to avoid RecursionError: maximum recursion depth exceeded easily

Usage

Ok, let's write recursive function:

def sumrange(x):
    if x == 0:
        return 0

    r = sumrange(x - 1)
    return x + r

print(sumrange(10)  # 55

Pretty simple. But what if we call it with bigger argument

print(sumrange(1000))
# RecursionError: maximum recursion depth exceeded

Let's fix it with precursion module:

@precurse
def sumrange(x):
    if x == 0:
        # return was:
        # return 0
        # now we need to use StopIteration exception:
        raise StopIteration(0)

    # recursive call was:
    # r = sumrange(x - 1)
    # now we use yield:
    r = yield sumrange.r(x - 1)
    raise StopIteration(x + r)

print(sumrange(1000))  # 500500!!1

That's it!

What is .r in sumrange.r?

It's unwrapped function, so you yield unwrapped generator

Pros and cons:

Pros

The code looks cleaner. Yep.

Cons

Function calls have performance and memory overhead, so using the decorator is slower than if you use Tail-call optimization via while or implement a stack inside a function.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

precursion-1.0.0.tar.gz (2.4 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page