Python takes 2 positional arguments but 3 were given

Python TypeError: __init__() takes 1 positional argument but 2 were given

Python shows TypeError: __init__() takes 1 positional argument but 2 were given when you instantiate an object of a class and pass more arguments to the constructor ( __init__() method) than it is expecting.

In Python, the instance of the class ( self ) is automatically passed as the first argument when calling an instance method.

The exception to this rule are:

  • class methods, which get the class instead of the instance as the first argument
  • static methods, which don’t get a first argument at all

When you define and instantiate a class as follows:

 Python will pass self, 8000 to the __init__ method under the hood.

But because you define only price as the parameter of the method, Python responds with an error:

To fix this error, you need to add self parameter to the __init__ method:

If you don’t need the self instance, you can declare a static method as shown below:

  A static method can be called directly from the class without having to create an instance.

Because static methods don’t receive a first argument, the code above runs without any issue.

Finally, this error can happen to any function you declare in your project. Suppose you have an add() function defined as follows:

The add() function is defined with two arguments, but 3 arguments were passed when calling that function.

As a result, Python raises another error:

Depending on what you want to achieve, you can either add another argument to the function definition, or you can remove the third argument from the function call.

To summarize, the message takes 1 positional argument but 2 were given means a method or function expects only 1 argument, but you are passing two.

If this error appears when calling the __init__ method, it’s likely that you forget to define the self argument, which is passed to the method implicitly.

To solve the error, add the self argument to the __init__ method as shown in this article.

Take your skills to the next level ⚡️

I’m sending out an occasional email with the latest tutorials on programming, web development, and statistics. Drop your email in the box below and I’ll send new stuff straight into your inbox!

About

Hello! This website is dedicated to help you learn tech and data science skills with its step-by-step, beginner-friendly tutorials.
Learn statistics, JavaScript and other programming languages using clear examples written for people.

Type the keyword below and hit enter

Источник

Python takes 2 positional arguments but 3 were given

Last updated: Jan 30, 2023
Reading time · 4 min

banner

# Table of Contents

# TypeError: takes 2 positional arguments but 3 were given

The Python «TypeError: takes 2 positional arguments but 3 were given» occurs for multiple reasons:

  1. Forgetting to specify the self argument in a class method.
  2. Forgetting to specify a third argument in a function’s definition.
  3. Passing three arguments to a function that only takes two.
  4. Overriding a built-in function by mistake.

typeerror takes 2 positional argument but 3 were given

Here is an example of how the error occurs.

Copied!
class Employee(): # 👇️ forgot to specify `self` arg def increase_salary(a, b): return a + b emp = Employee() # ⛔️ TypeError: Employee.increase_salary() takes 2 positional arguments but 3 were given result = emp.increase_salary(100, 100)

We forgot to specify the self argument in the definition of the increase_salary class method.

# Python automatically passes self to the class method

Python automatically passes self to the class method when it is called, so a method that takes 2 arguments gets passed 3 arguments which causes the error.

Copied!
class Employee(): # ✅ specify self as the first arg def increase_salary(self, a, b): return a + b emp = Employee() result = emp.increase_salary(100, 100) print(result) # 👉️ 200

python automatically passes self

self represents an instance of the class, so when we assign a variable as

Specifying the self argument in the method’s definition solves the error.

# If you don’t use the self argument, declare a static method

If your method doesn’t make use of the self argument, declare a static method.

Copied!
class Employee(): @staticmethod def increase_salary(a, b): return a + b emp = Employee() result = emp.increase_salary(100, 100) print(result) # 👉️ 200 result = Employee.increase_salary(100, 100) print(result) # 👉️ 200

declare static method if you dont need self

A static method doesn’t receive an implicit first argument and can be called on the class or on an instance of the class.

# Forgetting to specify the third argument in a function’s definition

The error is also caused when you forget to specify the third argument in a function’s definition or pass 3 arguments to a function that only takes 2.

Copied!
def do_math(a, b): return a + b # ⛔️ TypeError: do_math() takes 2 positional arguments but 3 were given do_math(10, 20, 30)

The do_math function takes two arguments but it gets called with 3.

In this situation, we either have to update the function’s declaration and take a third argument or remove the third argument from the function call.

Here is an example of removing the argument from the function call.

Copied!
def do_math(a, b): return a + b result = do_math(10, 20) print(result) # 👉️ 30

And here is an example of specifying the third argument in the function’s definition.

Copied!
def do_math(a, b, c): return a + b + c result = do_math(10, 20, 30) print(result) # 👉️ 60

Make sure you aren’t overriding any built-in functions or classes by declaring a function with the same name as that can also cause the error.

# TypeError: takes 1 positional argument but 2 were given

The solutions to the «TypeError: takes 1 positional argument but 2 were given» error are the same.

The Python error occurs for multiple reasons:

  1. Forgetting to specify the self argument in a class method.
  2. Forgetting to specify a second argument in a function’s definition.
  3. Passing two arguments to a function that only takes one.
  4. Overriding a built-in function by mistake.
Copied!
class Employee(): # 👇️ forgot to specify `self` arg def get_name(name): return name emp = Employee() # ⛔️ TypeError: Employee.get_name() takes 1 positional argument but 2 were given print(emp.get_name('Alice'))

typeerror takes 1 positional argument but 2 were given

Specify the self argument in the definition of the method to solve the error.

Copied!
class Employee(): # ✅ specify self as the first arg def get_name(self, name): return name emp = Employee() print(emp.get_name('Bobby')) # 👉️ "Bobby"

specify self argument

If your method doesn’t make use of the self argument, declare a static method.

Copied!
class Employee(): @staticmethod def get_name(name): return name emp = Employee() print(emp.get_name('Bobby')) # 👉️ "Bobby" print(Employee.get_name('Bobby')) # 👉️ "Bobby"

declaring static method

A static method does not receive an implicit first argument and can be called on the class or on an instance of the class.

The error is also caused when you forget to specify the second argument in a function’s definition or pass 2 arguments to a function that only takes 1.

Copied!
# ⛔️ TypeError: do_math() takes 1 positional argument but 2 were given def do_math(a): return a * a result = do_math(5, 10)

The do_math function takes a single argument but it gets called with 2.

In this situation, we either have to update the function’s declaration and take a second argument or remove the second argument from the function call.

Here is an example of removing the argument from the function call.

Copied!
def do_math(a): return a * a result = do_math(5) print(result) # 👉️ 25

And here is an example of specifying the second argument in the function’s definition.

Copied!
def do_math(a, b): return a * b result = do_math(5, 10) print(result) # 👉️ 50

Make sure you aren’t overriding any built-in functions or classes by declaring a function with the same name because that also causes the error.

# Conclusion

To solve the Python «TypeError: takes 2 positional arguments but 3 were given», make sure:

  1. You haven’t forgotten to specify the self argument in a class method.
  2. You haven’t forgotten to specify a third argument in a function’s definition.
  3. You haven’t passed 3 arguments to a function that only takes 2.
  4. You aren’t overriding a built-in method.

# Additional Resources

You can learn more about the related topics by checking out the following tutorials:

I wrote a book in which I share everything I know about how to become a better, more efficient programmer.

Источник

TypeError: left_go() takes 2 positional arguments but 3 were given

здравствуйте,пишет ошибку TypeError: left_go() takes 2 positional arguments but 3 were given
почему дается 3 аргумента?
вот код:

def left_go(self, instance): global lefti x = lefti - 0.01 lefti = x self.imggg2.pos_hint = {'x': x} print('start potok') threading = Thread(target=self.left_go, args = (self, instance)).start()

TypeError: Ship.__init__() takes 2 positional arguments but 3 were given И ЧЕРНЫЙ ЭКРАН НА ВЫВОДЕ (
from settings import Settings from ship import Ship import game_functions as gf def.

solve() takes 0 positional arguments but 3 were given
Есть код: from sympy import * from tkinter import * from tkinter.ttk import Frame, Button.

TypeError: preveiw_files() takes 1 positional argument but 2 were given
Добрый день. Не так давно начал осваивать Python, в том числе и создание графического интерфейса.

Эксперт Python

ЦитатаСообщение от Fger Посмотреть сообщение

Ты передаешь два + 1 который уже есть в методе.
Но не суть. Зачем ты хочешь вызвать в другом потоке эту же самую функцию?

Эксперт Python

Fger, чтобы функция не мешала остальной программе — для начала надо перестать пользоваться глобалками. Потом понять, что видимость переменной должны быть минимальна. Не лезьте пока в потоки, зачем вам эти сложности?

ЦитатаСообщение от Fger Посмотреть сообщение

Дело в том, что аргумент self тоже считается, это может сбить с толку.

Добавлено через 1 минуту
Fger, аааа, фак мой моск. Вы вызываете в новом потоке эту же функцию рекурсивно. Тренируетесь писать форк-бомбу?

Эксперт Python

ЦитатаСообщение от dondublon Посмотреть сообщение

Эксперт Python

Fger, можете погуглить. Эта такая программка, в которой главный процесс создаёт два или более таких же процессов. Моментально создаётся целая куча процессов и компьютер виснет от безнадёги. Ну, тут, правда нужны процессы, а не потоки, но вы уже встали на верный путь

Добавлено через 1 минуту
Fger, опишите словами, что хотите сделать. Может, и поможем. Уверен, второй поток тут не нужен.

Я хотел сделать что-бы при нажатии на кнопку двигалась картинка и паралельно ей могли двигатся другие обьекты.

Эксперт Python

По отдельности — как сдвинуть картинку знаете? Как обработать нажатие кнопки знаете?

Добавлено через 53 секунды
Движение картинки моментальное или медленное? Кажется, понял, в чём тут дело.
Какой фреймворк?

Kivy, при нажатии на кнопку двигается картинка но не плавно. Я хотел сделать поток потому-что если будет двигатся еще одна картинка то она же будет двигатся после первой?

Эксперт Python

Лучший ответ

Сообщение было отмечено Fger как решение

Решение

Fger, я понял.
Про Kivy я не в курсе, но в Qt, и вообще в серьёзных фреймворках, есть специальный класс со словом «animation» в названии, который позволяет делать подобные штуки без ручного создания потоков. Наверняка в киви должно что-то такое быть, погуглите.

Ну а если нет — то встаёт вопрос, правильно ли вы выбрали фреймворк.
Идти по пути собственного программирования анимаций, я считаю, непродуктивно. Хотя и можно, если из спортивного интереса.

Тоесть с помощью animation можно сделать перемещение обьектов что-бы они не ждали пока один обьект зауончит движение?

Добавлено через 2 минуты
Хорошо, спасибо. Я посмотрю и напишу

Добавлено через 12 минут
Здраствуйте, я погуглил и да в киви есть такая штука для передвижения обьектов и также с помощью него вроде можно сделать это паралельно. Спасибо вам что сказали. Сегодня попробую.

Здраствуйте, у меня вопрос по animation. Если ты делаеш анимацию перемещения картинки и не указываеш изначально координаты, то все работает но кнопка появляется в нижнем правым углу. А если указываеш координаты что-бы кнопка перемещадась от них то ничего не происходит. Также и с размером.. Почему так и как это исправить?

Anim = Animation(x = 100, y = 100) Anim.start(widget)

Эксперт Python

Лучший ответ

Сообщение было отмечено Fger как решение

Решение

Как заслуженному грамма-наци, разрешите вас поправить. Делаешь, указываешь.

Эксперт Python

TypeError: __getCoordX() takes 1 positional argument but 2 were given
Подскажите, что не так с моим кодом. При его запуске вызывается ошибка : TypeError: __getCoordX().

Ошибка TypeError: Dispatcher.__init__() takes 1 positional argument but 2 were given
Пишу Телеграмм бота на pythone. Выдает ошибку: Traceback (most recent call last): File.

TypeError: Robot() takes no arguments
Добрый вечер, Не могли бы вы помочь мне с одной проблемкой учусь сейчас по книге ‘укус питона’ и.

TypeError: Dog() takes no arguments
#определение класса объектов Dog class Dog: #метод для инициализации объекта внутренними.

TypeError: Database () takes no arguments
При добавление дб в код выдает ошибку File.

TypeError: Character() takes no arguments
class Character(): max_speed=100 deead_health=0 def.

Источник

Читайте также:  How to create date java
Оцените статью