I have this code to implement a Particle Swarm Optimization algorithm:
class Particle:
def __init__(self,domain,ID):
self.ID = ID
self.gbest = None
self.velocity = []
self.current = []
self.pbest = []
for x in range(len(domain)):
self.current.append(random.randint(domain[x][0],domain[x][1]))
self.velocity.append(random.randint(domain[x][0],domain[x][1]))
self.pbestx = self.current
def updateVelocity():
for x in range(0,len(self.velocity)):
self.velocity[x] = 2*random.random()*(self.pbestx[x]-self.current[x]) + 2 * random.random()*(self.gbest[x]-self.current[x])
def updatePosition():
for x in range(0,len(self.current)):
self.current[x] = self.current[x] + self.velocity[x]
def updatePbest():
if costf(self.current) < costf(self.best):
self.best = self.current
def psoOptimize(domain,costf,noOfParticles=20, noOfRuns=30):
particles = []
for i in range(noOfParticles):
particle = Particle(domain,i)
particles.append(particle)
for i in range(noOfRuns):
Globalgbest = []
cost = 9999999999999999999
for i in particles:
if costf(i.pbest) < cost:
cost = costf(i.pbest)
Globalgbest = i.pbest
for particle in particles:
particle.updateVelocity()
particle.updatePosition()
particle.updatePbest(costf)
particle.gbest = Globalgbest
return determineGbest(particles,costf)
When I run it, I get this error:
TypeError: updateVelocity() takes no arguments (1 given)
But it clearly says particle.updateVelocity()
, with nothing between the ()
. Where is the «1 given» argument coming from? What is wrong with the code, and how do I fix it?
I have this code to implement a Particle Swarm Optimization algorithm:
class Particle:
def __init__(self,domain,ID):
self.ID = ID
self.gbest = None
self.velocity = []
self.current = []
self.pbest = []
for x in range(len(domain)):
self.current.append(random.randint(domain[x][0],domain[x][1]))
self.velocity.append(random.randint(domain[x][0],domain[x][1]))
self.pbestx = self.current
def updateVelocity():
for x in range(0,len(self.velocity)):
self.velocity[x] = 2*random.random()*(self.pbestx[x]-self.current[x]) + 2 * random.random()*(self.gbest[x]-self.current[x])
def updatePosition():
for x in range(0,len(self.current)):
self.current[x] = self.current[x] + self.velocity[x]
def updatePbest():
if costf(self.current) < costf(self.best):
self.best = self.current
def psoOptimize(domain,costf,noOfParticles=20, noOfRuns=30):
particles = []
for i in range(noOfParticles):
particle = Particle(domain,i)
particles.append(particle)
for i in range(noOfRuns):
Globalgbest = []
cost = 9999999999999999999
for i in particles:
if costf(i.pbest) < cost:
cost = costf(i.pbest)
Globalgbest = i.pbest
for particle in particles:
particle.updateVelocity()
particle.updatePosition()
particle.updatePbest(costf)
particle.gbest = Globalgbest
return determineGbest(particles,costf)
When I run it, I get this error:
TypeError: updateVelocity() takes no arguments (1 given)
But it clearly says particle.updateVelocity()
, with nothing between the ()
. Where is the «1 given» argument coming from? What is wrong with the code, and how do I fix it?
The arguments a class object accepts are passed through a function called __init__()
. If you misspell this function in your class declaration, you’ll encounter a “TypeError: object() takes no arguments” error when you run your code.
In this guide, we talk about what this error means and why you may encounter it. We’ll walk through an example of this error to help you figure out how to fix it.
Find Your Bootcamp Match
- Career Karma matches you with top tech bootcamps
- Access exclusive scholarships and prep courses
Select your interest
First name
Last name
Phone number
By continuing you agree to our Terms of Service and Privacy Policy, and you consent to receive offers and opportunities from Career Karma by telephone, text message, and email.
TypeError: object() takes no arguments
Objects of a class can optionally accept arguments. These arguments are used to set values within an object. Consider the following code:
class Employee: def __init__(self, name) self.name = name
The __init__method lets us assign a value for the “self.name” variable in our class. We can reference this variable in any method in our class.
The __init__ method is a special method. It is often called a constructor. The constructor method must be spelled correctly, otherwise you cannot pass any arguments into a statement where you declare an object of a class.
For reference, the __init__ method is spelled as:
Two underscores, followed by “init”, followed by two underscores.
The “TypeError: object() takes no arguments” error can also be caused by improper indentation. If you have spelled the __init__ method correctly, check to make sure you use consistent spaces and tabs in your class.
An Example Scenario
We’re going to create a program that tracks information about a product in an electronics store. To start, define a class. This class serves as the blueprint for our products:
class Product: def _init_(self, name, price, brand): self.name = name self.price = price self.brand = brand def show_price(self): print("The price of {} is ${}.".format(self.name, self.price))
Our class contains two methods. The first method is our constructor. This method defines all the values that objects of our class can store. The second method lets us view the price of a product.
Next, we’re going to create an object of our class:
george_foreman = Product("Fit Medium Health Grill", 39.99, "George Foreman")
This code creates an object for a George Foreman grill that is on sale at the electronics store. Next, we’re going to call our show_price()
method so that we can view the price of this product:
george_foreman.show_price()
Let’s run our code and see what happens:
Traceback (most recent call last): File "main.py", line 10, in <module> george_foreman = Product("Fit Medium Health Grill", 39.99, "George Foreman") TypeError: Product() takes no arguments
Our code returns an error message.
The Solution
To assign initial values to variables inside an object, you have to specify the values of those variables as arguments in the statement where an object is declared.
This only works if there is a valid __init__ method in an object. Otherwise, Python does not know how to treat the values you have specified as arguments. Without a special __init__ method, Python would not know which method should process the arguments.
In our code, we have declared an _init_ method (with one underscore on each side):
class Product: def _init_(self, name, price, brand):
This is not treated the same as __init__. To solve this error, we have to rename this method so that it uses the right syntax:
class Product: def __init__(self, name, price, brand): self.name = name self.price = price self.brand = brand
We’ve renamed our method to __init__. Let’s run our code and see if it works:
The price of Fit Medium Health Grill is $39.99.
Our code successfully tells us the price of the George Foreman grill.
TypeError: this constructor takes no arguments
The “TypeError: object() takes no arguments” error appears as “TypeError: this constructor takes no arguments” in Python 2.x.
This message tells us that we have made a mistake in defining our constructor. To solve this problem, make sure that you spell the __init__()
method correctly and that you use the correct indentation in the class that is causing the error.
Conclusion
The “TypeError: object() takes no arguments” error is raised when you do not declare a method called __init__ in a class that accepts arguments.
To solve this error, double-check your code to ensure that __init__()
is spelled correctly. The method should have two underscores on either side of the word “init”.
Now you’re ready to fix this common Python error like a professional!
Программирование, Python, Учебный процесс в IT, Блог компании SkillFactory
Рекомендация: подборка платных и бесплатных курсов PR-менеджеров — https://katalog-kursov.ru/
Выяснить, что означают сообщения об ошибках Python, может быть довольно сложно, когда вы впервые изучаете язык. Вот список распространенных ошибок, которые приводят к сообщениям об ошибках во время выполнения, которые могут привести к сбою вашей программы.
1) Пропуск “:” после оператора if
, elif
, else
, for
, while
, class
или def
. (Сообщение об ошибке: “SyntaxError: invalid syntax
”)
Пример кода с ошибкой:
if spam == 42
print('Hello!')
2) Использование =
вместо ==
. (Сообщение об ошибке: “SyntaxError: invalid syntax
”)
= является оператором присваивания, а == является оператором сравнения «равно». Пример кода с ошибкой:
if spam = 42:
print('Hello!')
3) Использование неправильного количества отступов. (Сообщение об ошибке: «IndentationError: unexpected indent
» и «IndentationError: unindent does not match any outer indentation level
» и «IndentationError: expected an indented block
»)
Помните, что отступ увеличивается только после оператора, оканчивающегося на “:
” двоеточие, и впоследствии должен вернуться к предыдущему отступу.
Пример кода с ошибкой:
print('Hello!')
print('Howdy!')
… еще:
if spam == 42:
print('Hello!')
print('Howdy!')
… еще:
if spam == 42:
print('Hello!')
4) Забыть вызвать len()
в операторе цикла for
. (Сообщение об ошибке: “TypeError: 'list' object cannot be interpreted as an integer
”)
Обычно вы хотите перебирать индексы элементов в списке или строке, что требует вызова функции range()
. Просто не забудьте передать возвращаемое значение len(someList)
вместо передачи только someList
.
Пример кода с ошикой:
spam = ['cat', 'dog', 'mouse']
for i in range(spam):
print(spam[i])
(UPD: как некоторые указали, вам может понадобиться только for i in spam:
вместо приведенного выше кода. Но вышесказанное относится к очень законному случаю, когда вам нужен индекс в теле цикла, а не только само значение.)
5) Попытка изменить строковое значение. (Сообщение об ошибке: “TypeError: 'str' object does not support item assignment
”)
Строки являются неизменным типом данных. Пример кода с ошибкой:
spam = 'I have a pet cat.'
spam[13] = 'r'
print(spam)
Пример правильного варианта:
spam = 'I have a pet cat.'
spam = spam[:13] + 'r' + spam[14:]
print(spam)
6) Попытка объединить не строковое значение в строковое значение. (Сообщение об ошибке: “TypeError: Can't convert 'int' object to str implicitly”
)
Пример кода с ошибкой:
numEggs = 12
print('I have ' + numEggs + ' eggs.')
Правильный вариант:
numEggs = 12
print('I have ' + str(numEggs) + ' eggs.')
… или:
numEggs = 12
print('I have %s eggs.' % (numEggs))
7) Пропуск кавычки, в начале или конце строкового значения. (Сообщение об ошибке: “SyntaxError: EOL while scanning string literal”
)
Пример кода с ошикой:
print(Hello!')
… еще:
print('Hello!)
...еще:
myName = 'Al'
print('My name is ' + myName + . How are you?')
Опечатка в переменной или имени функции. (Сообщение об ошибке: “NameError: name 'fooba' is not defined”
)
Пример кода с ошибкой:
foobar = 'Al'
print('My name is ' + fooba)
...еще:
spam = ruond(4.2)
...еще:
spam = Round(4.2)
9) Опечатка в названии метода. (Сообщение об ошибке: “AttributeError: 'str' object has no attribute 'lowerr'”
)
Пример кода с ошибкой:
spam = 'THIS IS IN LOWERCASE.'
spam = spam.lowerr()
10) Выход за пределы массива. (Сообщение об ошибке: “IndexError: list index out of range”
)
Пример кода с ошибкой:
spam = ['cat', 'dog', 'mouse']
print(spam[6])
11) Использование несуществующего ключа словаря. (Сообщение об ошибке: “KeyError: 'spam'”
)
Пример кода с ошибкой:
spam = {'cat': 'Zophie', 'dog': 'Basil', 'mouse': 'Whiskers'}
print('The name of my pet zebra is ' + spam['zebra'])
12) Попытка использовать ключевые слова Python в качестве переменной (Сообщение об ошибке: “SyntaxError: invalid syntax”
)
Ключевые слова Python (также называются зарезервированные слова) не могут быть использованы для названия переменных. Ошибка будет со следующим кодом:
class = 'algebra'
Ключевые слова Python 3: and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, while, with, yield
13) Использование расширенного оператора присваивания для новой переменной. (Сообщение об ошибке: “NameError: name 'foobar' is not defined”
)
Не думайте, что переменные начинаются со значения, такого как 0
или пустая строка. Выражение с расширенным оператором как spam += 1
эквивалентно spam = spam + 1
. Это означает, что для начала в spam
должно быть какое-то значение.
Пример кода с ошибкой:
spam = 0
spam += 42
eggs += 42
14) Использование локальных переменных (с таким же именем как и у глобальной переменной) в функции до назначения локальной переменной. (Сообщение об ошибке: “UnboundLocalError: local variable 'foobar' referenced before assignment”
)
Использовать локальную переменную в функции, имя которой совпадает с именем глобальной переменной, довольно сложно. Правило таково: если переменной в функции когда-либо назначается что-то, она всегда является локальной переменной, когда используется внутри этой функции. В противном случае, это глобальная переменная внутри этой функции.
Это означает, что вы не можете использовать ее как глобальную переменную в функции до ее назначения.
Пример кода с ошибкой:
someVar = 42
def myFunction():
print(someVar)
someVar = 100
myFunction()
15) Попытка использовать range()
для создания списка целых чисел. (Сообщение об ошибке: “TypeError: 'range' object does not support item assignment”
)
Иногда вам нужен список целочисленных значений по порядку, поэтому range()
кажется хорошим способом создать этот список. Однако вы должны помнить, что range()
возвращает «объект диапазона», а не фактическое значение списка.
Пример кода с ошибкой:
spam = range(10)
spam[4] = -1
То что вы хотите сделать, выглядит так:
spam = list(range(10))
spam[4] = -1
(UPD: Это работает в Python 2, потому что Python 2’s range()
возвращает список значений. Но, попробовав сделать это в Python 3, вы увидите ошибку.)
16) Нет оператора ++
инкремента или --
декремента. (Сообщение об ошибке: “SyntaxError: invalid syntax”
)
Если вы пришли из другого языка программирования, такого как C++, Java или PHP, вы можете попытаться увеличить или уменьшить переменную с помощью ++
или --
. В Python таких операторов нет.
Пример кода с ошибкой:
spam = 0
spam++
То что вы хотите сделать, выглядит так:
spam = 0
spam += 1
17) UPD: как указывает Luchano в комментариях, также часто забывают добавить self
в качестве первого параметра для метода. (Сообщение об ошибке: «TypeError: TypeError: myMethod() takes no arguments (1 given)»
)
Пример кода с ошибкой:
class Foo():
def myMethod():
print('Hello!')
a = Foo()
a.myMethod()
Краткое объяснение различных сообщений об ошибках приведено в Приложении D книги «Invent with Python».
Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя онлайн-курсы SkillFactory:
- Курс «Профессия Data Scientist» (24 месяца)
- Курс «Профессия Data Analyst» (18 месяцев)
- Курс «Python для веб-разработки» (9 месяцев)
Читать еще
- 450 бесплатных курсов от Лиги Плюща
- Бесплатные курсы по Data Science от Harvard University
- 30 лайфхаков чтобы пройти онлайн-курс до конца
- Самый успешный и самый скандальный Data Science проект: Cambridge Analytica
Что означает ошибка TypeError: something() takes 0 positional arguments but 1 was given
Это когда аргументы появляются там, где их быть не должно
Это когда аргументы появляются там, где их быть не должно
Ситуация: вы решили освоить мощь классов и попробовать ООП на Python. Делаете всё как по учебнику: сначала описываете класс, внутри него метод, а внутри метода — простую команду, которая пишет тестовое сообщение на экране:
# объявляем класс
class myClass():
# внутри класса объявляем метод
def myMethod():
# внутри метода пишем команду, которую будет выполнять наш метод
print('Это вызов метода внутри класса')
# создаём новый объект на основе класса
a = myClass()
# вызываем метод этого объекта
a.myMethod()
Кажется, что всё правильно, но при запуске появляется ошибка:
❌TypeError: myMethod() takes 0 positional arguments but 1 was given
Странно, ведь мы всё сделали всё как нужно.
Что это значит: Python обнаружил аргументы там, где их быть не должно. А раз аргументы есть и компилятор не знает, что с ними делать, то он останавливается и выдаёт эту ошибку.
Когда встречается: во всех случаях, когда мы указываем лишние аргументы или ставим их там, где они не нужны. Это необязательно будут ситуации из ООП — ошибка с аргументом может появиться в любой программе, где есть лишний аргумент.
Что делать с ошибкой TypeError: something() takes 0 positional arguments but 1 was given
Общее решение очевидно: нужно посмотреть на строку, на которую ругается Python, проверить в ней все аргументы и сверить их количество с тем, что должно быть по синтаксису.
Вот простой случай: проверяем условие, и если всё сходится — выводим все названия ключей из словаря:
if choice == "5":
print("Решение найдено:")
for i in dictionary:
print(dictionary.keys(i))
Здесь будет такая же ошибка, потому что у keys() не может быть аргументов — он сразу выводит список всех ключей словаря. Достаточно написать так, чтобы ошибка ушла:
if choice == "5":
print("Решение найдено:")
for i in dictionary:
print(dictionary[i])
В нашем случае с ООП проблема чуть хитрее: Python ругается на строку a.myMethod()
, у которой и так в описании нет никаких параметров. Но здесь дело в другом — вызов метода таким способом и есть ошибка. Объект почему-то не знает, что у него есть метод, который можно вызывать сам по себе, и воспринимает команду myMethod()
как лишний аргумент.
Всё из-за того, что мы в описании метода не поставили в качестве аргумента ключевое слово self
— оно как раз показывает, что этот метод можно вызывать снаружи. Добавим это, и ошибка исчезнет:
# объявляем класс
class myClass():
# внутри класса объявляем метод
def myMethod(self):
# внутри метода пишем команду, которую будет выполнять наш метод
print('Это вызов метода внутри класса')
# создаём новый объект на основе класса
a = myClass()
# вызываем метод этого объекта
a.myMethod()
Вёрстка:
Кирилл Климентьев