【问题标题】:"add() argument after * must be an iterable, not int"“ * 之后的 add() 参数必须是可迭代的,而不是 int”
【发布时间】:2020-08-07 18:01:28
【问题描述】:

我正在学习如何在 python(3.6 版)中编写游戏代码,但我遇到了一个让我迷路的错误。我试图运行我的代码和这个追溯到 sprite.py(我从 python 库导入的文件)的错误消息。这是弹出的错误信息:

文件“C:\Users\aveil\AppData\Roaming\Python\Python36\site-packages\pygame\sprite.py”,第 142 行, 在 add self.add(*group) TypeError: add() argument after * must be an iterable, not int >>>

这是回溯导致的代码:

 has = self.__g.__contains__
    for group in groups:
        if hasattr(group, '_spritegroup'):
            if not has(group):
                group.add_internal(self)
                self.add_internal(group)
        else:
            self.add(*group)

我没有粘贴整个 sprite.py 文件,因为它有 1.6k 行,但我希望这是足够的上下文。我没有写 sprite.py,而且对编码还是比较陌生,所以这个错误让我很难过。我不确定“int”在哪里或如何将它从整数更改为“可迭代”。 如有任何建议,我将不胜感激!

【问题讨论】:

  • 如果您发布您自己编写的代码,而不是您未编写的代码,这可能会更有帮助。
  • 错误是group 是一个整数,而*group 用于将序列解压缩为方法调用的位置参数。我们不知道您的数据或self.add 是什么,因此很难提出解决方案。你是对的,发布大量代码是不可行的。但了解self.add 接受哪些参数会有所帮助。如果传递单个整数是合理的,那么self.add(group) 可能是正确的。但这是一个复杂的代码,试图用不同的输入做不同的事情,很难猜出作者的意图。
  • 您在groups 上显示了一个循环,代码似乎期望它包含具有_spritegroup 属性的对象或可迭代对象。你以某种方式给它一个整数值。显示完整的回溯,包括您将groups 传递给此代码的代码,以及您的设置方式。
  • 我的 2 美分:想想 foo(*[1,2,3]) 相当于 foo(1,2,3)。这就是*在这种情况下所做的事情。您显示的代码导致类似self.add(*1),好吧,1 不能像列表那样扩展,所以你得到了这个错误。可迭代只是可迭代对象的一个​​花哨名称for x in <iterable here> 是迭代的典型示例。 IHIH
  • 我们不需要对add 方法进行故障排除,错误消息清楚地说明了调用它时出了什么问题。问题是,为什么你的代码在期望其他东西时给这个库代码一个整数。显示调用此代码的您的代码

标签: python pygame sprite


【解决方案1】:

*args --> 当作为参数传递给函数时,会导致可迭代对象(列表、元组)被解包并传递给函数。

**kwarg --> 当作为参数传递给函数时会导致字典解包

(请注意args和kwargs是代表变量,可以是任意名称)

在你的情况下 self.add(*group) , group 不是可迭代的,而是一个 int 值。因此出现错误。

【讨论】:

    【解决方案2】:

    错误在于您的代码,而不是 PyGame Sprite 库。

    创建精灵后,可以选择性地发送一些精灵应该是其中成员的SpriteGroup 组。这些被放入 parent __init__() 调用中:

    class Block( pygame.sprite.Sprite ):
        def __init__( self, png_image, x, y ):
           # Call the parent class (Sprite) constructor
           pygame.sprite.Sprite.__init__( self, some_groups )    # <-- HERE
           self.image = png_image
           self.rect  = self.image.get_rect()
    

    但是,不知何故,您的代码有一个整数(数字)值而不是 SpriteGroup,而 sprite 类对此有所抱怨。

    我只是猜测,但我怀疑你有类似的东西:

    class Block( pygame.sprite.Sprite ):
        def __init__( self, png_image, x, y ):
           # Call the parent class (Sprite) constructor
           pygame.sprite.Sprite.__init__( self, x, y )    # <-- HERE
           ...
    

    因为这给出了您引用的错误。要修复它,只需从 pygame.sprite.Sprite.__init__ 调用中删除所有参数,self 除外。

    【讨论】:

    • 对不起,@Kingsley,这么久没有回来,但我测试了你的建议,我只得到了更多的错误。我相信我在精灵构造函数中添加的大多数整数都是必需的,以使精灵正常运行。
    • @Simone - 是的,将它们保存在 sprite 构造函数中,但不是调用 parent Sprite.__init__().
    • 非常感谢@Kingsley,感谢所有提出解决方案的人。我的代码现在运行正常。
    • 该错误已通过编辑更新功能的位置并确保所有内容都正确放置在其中得到修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多