# Python | Recursion limit handling

| | | | | |

In this article, we’ll look at why this error occurs and how to fix it in Python. To understand this, we need to first look at tail recursion.

 ` # Simple recursive function ` ` # to calculate the factorial of a number ` ` def ` ` fact (n): ` ` if ` ` (n ` ` = ` ` = ` ` 0 ` `): ` ` return ` ` 1 ` ` return ` ` n ` ` * ` ` fact (n ` ` - ` ` 1 ` `) ` ` if ` ` __ name__ ` ` = ` ` = ` ` ’__main__ ’` `: ` ` ` ` ` ` # accepting input ` ` ` ` f ` ` = ` ` int ` ` (` ` input ` ` (` `’ Enter the number: ’` `)) ` ` print ` ` (fact (f)) `` `

Output: Using the ` setrecursionlimit () ` method we can increase the recursion limit and the program can be executed without errors even on large entrances.

 ` # sys module import ` ` import ` ` sys ` ` # setrecursionlimit function ` ` # used to change the default recursion ` ` # limit set by python. Using this, ` ` # we can increase the recursion limit ` ` # to suit our needs ` ` sys.setrecursionlimit (` ` 10 ` ` * ` ` * ` ` 6 ` `) ` ` ` ` # simple recursive function ` ` # to calculate the factorial of a number ` ` # one parameter is required, ` ` # the number whose factorial ` ` # I want to calculate and return ` ` # its factorial ` ` def ` ` fact (n): ` ` ` ` ` ` if ` ` (n ` ` = ` ` = ` ` 0 ` `): ` ` return ` ` 1 ` ` ` ` return ` ` n ` ` * ` ` fact (n ` ` - ` ` 1 ` `) ` ` if ` ` __ name__ ` ` = ` ` = ` `’ __main__’ ` `: ` ` # accepting input ` < / p> ` f ` ` = ` ` int ` ` (` ` input ` ` (` ` ’Enter the number:’ ` `)) ` ` print ` ` (fact (f)) `

Output: ## Python | Recursion limit handling around: Questions

Removing white space around a saved image in matplotlib

I need to take an image and save it after some process. The figure looks fine when I display it, but after saving the figure, I got some white space around the saved image. I have tried the `"tight"` option for `savefig` method, did not work either. The code:

``````  import matplotlib.image as mpimg
import matplotlib.pyplot as plt

fig = plt.figure(1)
plt.imshow(img)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig("1.png", bbox_inches=extent)

plt.axis("off")
plt.show()
``````

I am trying to draw a basic graph by using NetworkX on a figure and save it. I realized that without a graph it works, but when added a graph I get white space around the saved image;

``````import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()
pos = {1:[100,120], 2:[200,300], 3:[50,75]}

fig = plt.figure(1)
plt.imshow(img)

nx.draw(G, pos=pos)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig("1.png", bbox_inches = extent)

plt.axis("off")
plt.show()
``````
228

You can remove the white space padding by setting `bbox_inches="tight"` in `savefig`:

``````plt.savefig("test.png",bbox_inches="tight")
``````

You"ll have to put the argument to `bbox_inches` as a string, perhaps this is why it didn"t work earlier for you.

Possible duplicates:

Matplotlib plots: removing axis, legends and white spaces

How to set the margins for a matplotlib figure?

Reduce left and right margins in matplotlib plot

228

I cannot claim I know exactly why or how my “solution” works, but this is what I had to do when I wanted to plot the outline of a couple of aerofoil sections — without white margins — to a PDF file. (Note that I used matplotlib inside an IPython notebook, with the -pylab flag.)

``````plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
plt.margins(0,0)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.savefig("filename.pdf", bbox_inches = "tight",
``````

I have tried to deactivate different parts of this, but this always lead to a white margin somewhere. You may even have modify this to keep fat lines near the limits of the figure from being shaved by the lack of margins.

## Python | Recursion limit handling mean: Questions

Meaning of @classmethod and @staticmethod for beginner? By user1632861

Could someone explain to me the meaning of `@classmethod` and `@staticmethod` in python? I need to know the difference and the meaning.

As far as I understand, `@classmethod` tells a class that it"s a method which should be inherited into subclasses, or... something. However, what"s the point of that? Why not just define the class method without adding `@classmethod` or `@staticmethod` or any `@` definitions?

tl;dr: when should I use them, why should I use them, and how should I use them?

1726

Though `classmethod` and `staticmethod` are quite similar, there"s a slight difference in usage for both entities: `classmethod` must have a reference to a class object as the first parameter, whereas `staticmethod` can have no parameters at all.

## Example

``````class Date(object):

def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year

@classmethod
def from_string(cls, date_as_string):
day, month, year = map(int, date_as_string.split("-"))
date1 = cls(day, month, year)
return date1

@staticmethod
def is_date_valid(date_as_string):
day, month, year = map(int, date_as_string.split("-"))
return day <= 31 and month <= 12 and year <= 3999

date2 = Date.from_string("11-09-2012")
is_date = Date.is_date_valid("11-09-2012")
``````

## Explanation

Let"s assume an example of a class, dealing with date information (this will be our boilerplate):

``````class Date(object):

def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year
``````

This class obviously could be used to store information about certain dates (without timezone information; let"s assume all dates are presented in UTC).

Here we have `__init__`, a typical initializer of Python class instances, which receives arguments as a typical `instancemethod`, having the first non-optional argument (`self`) that holds a reference to a newly created instance.

Class Method

We have some tasks that can be nicely done using `classmethod`s.

Let"s assume that we want to create a lot of `Date` class instances having date information coming from an outer source encoded as a string with format "dd-mm-yyyy". Suppose we have to do this in different places in the source code of our project.

So what we must do here is:

1. Parse a string to receive day, month and year as three integer variables or a 3-item tuple consisting of that variable.
2. Instantiate `Date` by passing those values to the initialization call.

This will look like:

``````day, month, year = map(int, string_date.split("-"))
date1 = Date(day, month, year)
``````

For this purpose, C++ can implement such a feature with overloading, but Python lacks this overloading. Instead, we can use `classmethod`. Let"s create another "constructor".

``````    @classmethod
def from_string(cls, date_as_string):
day, month, year = map(int, date_as_string.split("-"))
date1 = cls(day, month, year)
return date1

date2 = Date.from_string("11-09-2012")
``````

Let"s look more carefully at the above implementation, and review what advantages we have here:

1. We"ve implemented date string parsing in one place and it"s reusable now.
2. Encapsulation works fine here (if you think that you could implement string parsing as a single function elsewhere, this solution fits the OOP paradigm far better).
3. `cls` is an object that holds the class itself, not an instance of the class. It"s pretty cool because if we inherit our `Date` class, all children will have `from_string` defined also.

Static method

What about `staticmethod`? It"s pretty similar to `classmethod` but doesn"t take any obligatory parameters (like a class method or instance method does).

Let"s look at the next use case.

We have a date string that we want to validate somehow. This task is also logically bound to the `Date` class we"ve used so far, but doesn"t require instantiation of it.

Here is where `staticmethod` can be useful. Let"s look at the next piece of code:

``````    @staticmethod
def is_date_valid(date_as_string):
day, month, year = map(int, date_as_string.split("-"))
return day <= 31 and month <= 12 and year <= 3999

# usage:
is_date = Date.is_date_valid("11-09-2012")
``````

So, as we can see from usage of `staticmethod`, we don"t have any access to what the class is---it"s basically just a function, called syntactically like a method, but without access to the object and its internals (fields and another methods), while classmethod does.

1726

Rostyslav Dzinko"s answer is very appropriate. I thought I could highlight one other reason you should choose `@classmethod` over `@staticmethod` when you are creating an additional constructor.

In the example above, Rostyslav used the `@classmethod` `from_string` as a Factory to create `Date` objects from otherwise unacceptable parameters. The same can be done with `@staticmethod` as is shown in the code below:

``````class Date:
def __init__(self, month, day, year):
self.month = month
self.day   = day
self.year  = year

def display(self):
return "{0}-{1}-{2}".format(self.month, self.day, self.year)

@staticmethod
def millenium(month, day):
return Date(month, day, 2000)

new_year = Date(1, 1, 2013)               # Creates a new Date object
millenium_new_year = Date.millenium(1, 1) # also creates a Date object.

# Proof:
new_year.display()           # "1-1-2013"
millenium_new_year.display() # "1-1-2000"

isinstance(new_year, Date) # True
isinstance(millenium_new_year, Date) # True
``````

Thus both `new_year` and `millenium_new_year` are instances of the `Date` class.

But, if you observe closely, the Factory process is hard-coded to create `Date` objects no matter what. What this means is that even if the `Date` class is subclassed, the subclasses will still create plain `Date` objects (without any properties of the subclass). See that in the example below:

``````class DateTime(Date):
def display(self):
return "{0}-{1}-{2} - 00:00:00PM".format(self.month, self.day, self.year)

datetime1 = DateTime(10, 10, 1990)
datetime2 = DateTime.millenium(10, 10)

isinstance(datetime1, DateTime) # True
isinstance(datetime2, DateTime) # False

datetime1.display() # returns "10-10-1990 - 00:00:00PM"
datetime2.display() # returns "10-10-2000" because it"s not a DateTime object but a Date object. Check the implementation of the millenium method on the Date class for more details.
``````

`datetime2` is not an instance of `DateTime`? WTF? Well, that"s because of the `@staticmethod` decorator used.

In most cases, this is undesired. If what you want is a Factory method that is aware of the class that called it, then `@classmethod` is what you need.

Rewriting `Date.millenium` as (that"s the only part of the above code that changes):

``````@classmethod
def millenium(cls, month, day):
return cls(month, day, 2000)
``````

ensures that the `class` is not hard-coded but rather learnt. `cls` can be any subclass. The resulting `object` will rightly be an instance of `cls`.
Let"s test that out:

``````datetime1 = DateTime(10, 10, 1990)
datetime2 = DateTime.millenium(10, 10)

isinstance(datetime1, DateTime) # True
isinstance(datetime2, DateTime) # True

datetime1.display() # "10-10-1990 - 00:00:00PM"
datetime2.display() # "10-10-2000 - 00:00:00PM"
``````

The reason is, as you know by now, that `@classmethod` was used instead of `@staticmethod`

1726

`@classmethod` means: when this method is called, we pass the class as the first argument instead of the instance of that class (as we normally do with methods). This means you can use the class and its properties inside that method rather than a particular instance.

`@staticmethod` means: when this method is called, we don"t pass an instance of the class to it (as we normally do with methods). This means you can put a function inside a class but you can"t access the instance of that class (this is useful when your method does not use the instance).

## Shop Best laptop for Fortnite

\$ Best laptop for Excel

\$ Best laptop for Solidworks

\$ Best laptop for Roblox

\$ Best computer for crypto mining

\$ Best laptop for Sims 4

\$ Best laptop for Zoom

\$499 Best laptop for Minecraft

\$590

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

NUMPYNUMPY

How to convert Nonetype to int or string?

NUMPYNUMPY

How to specify multiple return types using type-hints

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

## Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method