In Python to call a function, we use the function name followed by the parenthesis ()
. But if we try to call other Python objects like, int
, list
, str
, tuple
, etc. using parenthesis we receive the TypeError Exception with an error message that the following object is not callable.
None
is a reserved keyword value in Python, which data type is NoneType
. If we put parenthesis “()” after a None value and try to call it as a function we receive the TypeError: 'NoneType' object is not callable
Error.
In this Python guide, we will walk through this Python error and discuss why it occurs in Python and how to solve it. We will also discuss a common example scenario where many Python learners commit mistakes while writing the program and encounter this error.
So let’s get started with the Error Statement
Problem: TypeError: ‘NoneType’ object is not callable
The TypeError: 'NoneType' object is not callable
is a standard Python error statement and like other error statements, it can be divided into two parts.
- Exception Type
TypeError
- Error Message (
'NoneType' object is not callable
)
TypeError
TypeError is a standard Python exception, it occurs in a Python program when we perform an unsupportable operation on a specific Python object.
For instance, integer objects do not support indexing in Python. And if we try to perform indexing on an integer object, we also receive the TypeError with some error message.
‘NoneType’ object is not callable
“NoneType object is not callable” is an error message, and it is raised in the program when we try to call a NoneType object as a function.
There is only one NoneType object value in Python None
# None Value obj = None print('Type of obj is: ',type(obj))
Output
Type of obj is: <class 'NoneType'>
And if we try to call the None value objects or variables as a function using parenthesis () we receive the TypeError with the message ‘NoneType’ object is not callable’
Example
# None Value obj = None # call None obj as a function obj()
Output
Traceback (most recent call last): File "main.py", line 5, in obj() TypeError: 'NoneType' object is not callable
In this example, we tried to call the obj
variable as a function obj()
and we received the Error.
The value of obj
is None
which make the obj
a NoneType
object, and we can not perform function calling on a NoneType object. When the Python interpreter read the statement obj()
, it tried to call the obj as a function, but soon it realised that obj
is not a function and the interpreter threw the error.
Common Example Scenario
The most common example where many Python learners encounter this error is when they use the same name for a function and a None Type variable.
None value is mostly used to define an initial value, and if we define a function as the same name of the variable with None value we will receive this error in our Program.
Example
Let’s create a Python function result()
that accepts a list of paired tuples students [(name,marks)]
and return the name and the marks of the student who get the maximum marks.
def result(students): # initilize the highest_marks highest_marks = 0 for name, marks in students: if marks> highest_marks: rank1_name = name highest_marks =marks return (rank1_name, highest_marks) students = [("Aditi Musunur", 973), ("Amrish Ilyas", 963), ("Aprativirya Seshan", 900), ("Debasis Sundhararajan", 904), ("Dhritiman Salim",978) ] # initial result value result = None # call the result function result = result(students) print(f"The Rank 1 Student is {result[0]} with {result[1]} marks")
Output
Traceback (most recent call last): File "main.py", line 22, in result = result(students) TypeError: 'NoneType' object is not callable
Break the code
In this example, we are getting the error in 22 with result = result(students)
statement.
This is because at that point result is not a function name but a None
value variable. Just above the function calling statement, we have defined the result
value as None using the result = None
statement.
As Python execute its code from top to bottom the value of the result
object changed from function
to None
when we define the result
initial value after the function definition. And the Python interpreter calls the None object as a function when it interprets the result()
statement.
Solution
The solution to the above problem is straightforward. When writing a Python program we should always consider using the different names for functions and value identifiers or variables.
To solve the above problem all we need to do is define a different name for the result variable that we used to store the return value of the result function.
def result(students): # initilize the highest_marks highest_marks = 0 for name, marks in students: if marks> highest_marks: rank1_name = name highest_marks =marks return (rank1_name, highest_marks) students = [("Aditi Musunur", 973), ("Amrish Ilyas", 963), ("Aprativirya Seshan", 900), ("Debasis Sundhararajan", 904), ("Dhritiman Salim",978) ] # initialize the initial value rank1= None # call the result function rank1 = result(students) print(f"The Rank 1 Student is {rank1[0]} with {rank1[1]} marks")
Output
The Rank 1 Student is Dhritiman Salim with 978 marks
Conclusion
In this Python error tutorial, we discussed TypeError: 'NoneType' object is not callable
Error, and learn why this error occurs in Python and how to debug it. You will only encounter this error in your Python program when you try to call a None object as a function. To debug this error you carefully need to read the error and go through the code again and look for the line which is causing this error. With some practice, you will be able to solve this error in your program in no time.
If you are still getting this error in your Python program, you can share the code in the comment section. We will try to help you in debugging.
People are also reading: