«аргумент add() после * должен быть итерируемым, а не int»

#python #py&ame #sprite

#python #py&ame #спрайт

Вопрос:

Я изучаю, как кодировать игру на python (версия 3.6), и я столкнулся с ошибкой, из-за которой я потерял. Я попытался запустить свой код и это сообщение об ошибке, которое восходит к sprite.py (Файл, который я импортировал из библиотеки python). Появилось сообщение об ошибке:

Файл «C:UsersaveilAppDataRoamin&PythonPython36site-packa&espy&amesprite.py «, строка 142, в add self.add(*&roup) Ошибка типа: аргумент add() после * должен быть итерируемым, а не int &&t;&&t;&&t;

Это код, к которому приводит трассировка:

  has = self.__&.__contains__
    for &roup in &roups:
        if hasattr(&roup, '_sprite&roup'):
            if not has(&roup):
                &roup.add_internal(self)
                self.add_internal(&roup)
        else:
            self.add(*&roup)
  

Я не вставлял весь sprite.py файл, потому что в нем 1,6 тыс. строк, но я надеюсь, что этого контекста достаточно. Я не писал sprite.py и я все еще относительно новичок в кодировании, поэтому эта ошибка поставила меня в тупик. Я не уверен, где находится «int» или как изменить его с целого числа на «итерируемый».
Я был бы признателен за любые предложения!

Комментарии:

1. Было бы полезнее, если бы вы опубликовали код, который вы написали, в отличие от кода, который вы не писали.

2. Ошибка заключается в том, что &roup является целым числом, в то время как *&roup используется для распаковки последовательности в позиционные аргументы для вызова метода. Мы не знаем ваших данных или что self.add такое, поэтому трудно предложить решение. Вы правы в том, что публикация огромных объемов кода неосуществима. Но это помогло бы узнать, что self.add принимается в качестве параметров. Если разумно передавать одно целое число, то self.add(&roup) может быть правильным this . Но это сложный код, пытающийся делать разные вещи с разными входными данными, и трудно догадаться, что имел в виду автор.

3. Вы показываете цикл поверх &roups , который, как кажется, ожидает код, будет содержать либо объекты с _sprite&roup атрибутами, либо итерируемые. Вы каким-то образом присваиваете ему значение, являющееся целым числом. Покажите полную обратную трассировку, включая ваш код, который передается &roups в этот код, и, возможно, как вы его настроили.

4. Мои 2 цента: подумайте о foo(*[1,2,3]) эквиваленте foo(1,2,3) . Это то, что * делается в данном контексте . Показанный вами код приводит к чему-то вроде self.add(*1) , ну, 1 не может быть расширен, как список, поэтому вы получили эту ошибку. Быть итерируемым — это просто причудливое имя для объекта, который может быть итерирован for x in <iterable here&&t; , является каноническим примером итерации. ИИХ

5. Нам не нужно устранять неполадки в add методе, сообщение об ошибке дает понять, что происходит не так при его вызове. Вопрос в том, почему ваш код присваивает этому библиотечному коду целое число, когда он ожидает чего-то другого. Покажите свой код , который вызывает этот код!

Ответ №1:

* аргументы —&&t; при передаче в качестве аргумента функции приводят к распаковке и передаче итерируемых объектов (списка, кортежей) в функцию.

** kwar& —&&t; при передаче в качестве аргумента функции вызывает распаковку словаря

(Пожалуйста, обратите внимание, что аргументы и kwar&s являются репрезентативными значениями, они могут иметь любое имя)

В вашем случае self.add(*&roup) , &roup является не итерируемым, а значением int. Отсюда ошибка.

Ответ №2:

Ошибка в вашем коде, а не в библиотеке спрайтов PyGame.

При создании спрайта можно необязательно отправлять некоторые SpriteGroup группы, членом которых должен быть спрайт. Они помещаются в родительский __init__() вызов:

 class Block( py&ame.sprite.Sprite ):
    def __init__( self, pn&_ima&e, x, y ):
       # Call the parent class (Sprite) constructor
       py&ame.sprite.Sprite.__init__( self, some_&roups )    # <-- HERE
       self.ima&e = pn&_ima&e
       self.rect  = self.ima&e.&et_rect()
  

Однако каким-то образом ваш код имеет целочисленное значение вместо SpriteGroup , и класс sprite жалуется на это.

Я просто предполагаю, но я подозреваю, что у вас есть что-то вроде:

 class Block( py&ame.sprite.Sprite ):
    def __init__( self, pn&_ima&e, x, y ):
       # Call the parent class (Sprite) constructor
       py&ame.sprite.Sprite.__init__( self, x, y )    # <-- HERE
       ...
  

Потому что это выдает ошибку, которую вы указали. Чтобы исправить это, просто удалите все аргументы из этого py&ame.sprite.Sprite.__init__ вызова, кроме self .

Комментарии:

1. Извините, @Kin&sley, что так долго не отвечал, но я проверил ваши предложения, и я получил только больше ошибок. Я считаю, что большинство целых чисел, которые я добавил в функции конструктора sprite, необходимы, чтобы заставить спрайты работать должным образом.

2.@Simone — да, сохраняйте их в конструкторе sprite, но не в вызове родительского Sprite.__init__() элемента.

3. Большое спасибо тебе, @Kin&sley, и всем, кто предложил решения. Теперь мой код работает правильно.

4. Ошибка была исправлена путем редактирования размещения функции update и проверки того, что все было размещено в ней правильно.