From teaching hundreds of thousands of students Python, I found this error to be a classic. I think understanding classes is hard enough, but many coders who’ve just started to learn about Python are rightly confused ? about the TypeError that complains about too few positional arguments. Let’s resolve this confusion once and for all, shall we?
Problem Formulation: Method Takes One Arguments But Two Are Given
Consider the following minimal example where this error occurs. Most occurrences of this error are variants of the following usage—you define method with one argument, but when calling it with one argument, Python raises the error:
class YourClass: def method(your_arg): # One positional argument defined print(your_arg) o = YourClass() o.method('finxter') # Calling it with one argument
However, this code snippet raises an error: TypeError: method() takes 1 positional argument but 2 were given
Traceback (most recent call last): File "C:\Users\xcent\Desktop\code.py", line 6, in <module> o.method('finxter') TypeError: method() takes 1 positional argument but 2 were given
Here’s how it looks in my IDLE shell:
What is the origin of this error?
Solution: First Positional Argument Must be Self
You can solve the TypeError: method() takes 1 positional argument but 2 were given
by adding an argument named self
to your method definition as a first positional argument. But when calling it, you skip the name, so you’d define method(self, arg)
but call method(arg)
. Python implicitly passes a reference to the instance as a first method argument, that’s why it tells you that two arguments are given.
class YourClass: def method(self, your_arg): # One positional argument defined print(your_arg) o = YourClass() o.method('finxter') # Calling it with one argument
Now, the output doesn’t contain an error:
finxter
The reason is simple: the first keyword is a reference to the instance on which it is called. So, if you call
o.method('finxter')
Python automatically converts it to
YourClass.method(o, 'finxter')
passing the instance on which it is called as a first positional argument usually named self
. This is just syntactic sugar but you need to understand it once to overcome your confusion forever.
Background
The name self
is, by convention, the name of the first argument of a Python class method. The variable self
points to the concrete instance on which the method is called. It is used within the method to access attributes and other methods of the same instance. The caller of the method does not explicitly pass the instance into self but leaves it to the Python interpreter to pass it automatically. For example, given an object car
, Python automatically converts the method call car.drive()
to drive(self=car)
.
Feel free to join our community of ambitious coders and download your cheat sheets: