类型错误:new() 缺少 1 个必需的位置参数:'y'

Posted

技术标签:

【中文标题】类型错误:new() 缺少 1 个必需的位置参数:\'y\'【英文标题】:Type Error: new() missing 1 required positional argument: 'y'类型错误:new() 缺少 1 个必需的位置参数:'y' 【发布时间】:2021-08-05 12:46:12 【问题描述】:

我正在尝试实现一个机器人环境,它是英特尔提供的免费课程的一部分。课程作业中有多个文件,MakeItLearn.py 是我们应该编辑的文件,并在那里添加我们自己的网络以训练机器人。

但是当我尝试使用英特尔也提供的ExploreAndCollect.py 文件收集数据并且我们没有被告知要更改该文件中的任何内容时,它会引发以下错误:

Traceback (most recent call last):   File "ExploreAndCollect.py", line 268, in <module>     env = BotEnv()   File "ExploreAndCollect.py", line 35, in __init__     self.BuildBot(50.01, 450.01, 20)   File "ExploreAndCollect.py", line 69, in BuildBot     BoxPoints = list(map(Vec2d, [(-size, -size), (-size, size), (size,size), (size, -size)])) TypeError: __new__() missing 1 required positional argument: 'y'

这是定义类和函数的代码:

class BotEnv:
    def __init__(self):
        ## Initialize Required Variables
        self.crashed = False
        self.DetectCrash = 0
        self.space = pymunk.Space()
        self.BuildBot(50.01, 450.01, 20)  <---------------------------------------------
        self.walls = []
        self.WallShapes = []
        self.WallRects = []
        ## Add Walls To The Map ###
        WallBody, WallShape, WallRect = self.BuildWall(200, 50, 50)
        self.WallRects.append(WallRect)
        WallBody, WallShape, WallRect = self.BuildWall(200, 125, 50)
        self.WallRects.append(WallRect)
        WallBody, WallShape, WallRect = self.BuildWall(200, 550, 50)
        self.WallRects.append(WallRect)
        WallBody, WallShape, WallRect = self.BuildWall(200, 450, 50)
        self.WallRects.append(WallRect)
        WallBody, WallShape, WallRect = self.BuildWall(400, 350, 50)
        self.WallRects.append(WallRect)
        WallBody, WallShape, WallRect = self.BuildWall(400, 250, 50)
        self.WallRects.append(WallRect)
        WallBody, WallShape, WallRect = self.BuildWall(500, 250, 50)
        self.WallRects.append(WallRect)
        WallBody, WallShape, WallRect = self.BuildWall(600, 250, 50)
        self.WallRects.append(WallRect)
        WallBody, WallShape, WallRect = self.BuildWall(115, 1050, 500)
        self.WallRects.append(WallRect)
        self.PreviousAction = 0

    def BuildBot(self, x, y, r):
        ### Build The Bot Object ###
        size = r
        BoxPoints = list(map(Vec2d, [(-size, -size), (-size, size), (size,size), (size, -size)])) <----------------
        mass  = 0.5
        moment = pymunk.moment_for_poly(mass,BoxPoints, Vec2d(0,0))
        self.Bot = pymunk.Body(mass, moment)
        self.Bot.position = (x,y) # Declare Bot Position
        self.Bot.angle = 1.54     # Set the Bot Angle
        BotDirection = Vec2d(PointsFromAngle(self.Bot.angle)) # Get The Direction Vector From Angle
        self.space.add(self.Bot)
        self.BotRect = pygame.Rect(x-r,600-y-r, 2*r, 2*r)
        return self.Bot

我查看了上面也提到的函数调用,其中包含y 组件,所以我似乎找不到导致错误的原因。 python 环境要求为 Python 2.7 和 Python 3 的所有版本

【问题讨论】:

看来Vec2d 有两个参数,xy。它只得到一个,带有xy 坐标的元组(例如(size, size))。所以x 的值有误,y 没有设置。 您可以尝试将map替换为itertools.starmap。 如果我使用starmap,则会收到错误消息 - File "ExploreAndCollect.py", line 76, in BuildBot BotDirection = Vec2d(PointsFromAngle(self.Bot.angle)) # Get The Direction Vector From Angle TypeError: __new__() missing 1 required positional argument: 'y' 这意味着使用 starmap 修复了第 69 行的错误,现在您在第 76 行有相同的错误。您可以使用 Vec2d(*PointsFromAngle(self.Bot.angle)) 修复它(注意 *)。但问题是为什么这个错误不断出现?您使用的Vec2d 是否正确? 正如我在上面的描述中所写,这个文件不是我创建的,它是由英特尔作为免费课程创建的,但是当我尝试使用上面的文件运行模拟时,它会抛出一个错误。这是您可以下载代码文件的课程链接:software.intel.com/content/www/us/en/develop/training/… 【参考方案1】:

出了什么问题?

您正在学习的课程附带的代码使用pymunk.vec2d.Vec2d。最近对Vec2d 进行了更新,使其成为NamedTuple。在此更改之前,Vec2d 可以使用元组创建:

vec2d = Vec2d((x, y))

这已经不可能了。 Vec2d 是具有字段 xy 的命名元组,可以使用以下方法创建:单独的参数、用于元组解包的 * 语法或 Vec2d._make:

v1 = Vec2d(3, 4)
v2 = Vec2d(*(3, 4))
v3 = Vec2d._make((3, 4))

这在the Changelog for Pymunk(版本6.0.0)中都有描述:

使 Vec2d 成为 NamedTuple 的子类。 Vec2ds 必须使用单独的 x 和 a y 值构造。 Vec2d((1,2)) 可以更改为 Vec2d(*(1,2))。 Vec2d(Vec2d(1,2)) 可以更改为 Vec2d(*Vec2d(1,2))。 Vec2d() 可以更改为 Vec2d(0,0) 或 Vec2d.zero()。 Vec2d(1,2) 不再等于 [1,2],因为它们属于不同的类型。 (但 Vec2d(1,2) == (1,2) 仍然为真)

那么你能做什么呢?

您可能应该让英特尔的人员知道他们的代码在 Pymunk 6.0.0 及更高版本中被破坏。目前,您可以尝试使用 6.0.0 之前的 Pymunk 版本(这可能是最好的解决方案),或者您可以更改课程附带的代码并使用上述选项之一。

【讨论】:

以上是关于类型错误:new() 缺少 1 个必需的位置参数:'y'的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:parse() 缺少 1 个必需的位置参数:'stream'

类型错误:预测()缺少 1 个必需的位置参数:'params'

类型错误:预测()缺少 1 个必需的位置参数:'y_train'

类型错误:攻击()缺少 1 个必需的位置参数:“自我”

类型错误:<lambda>() 缺少 1 个必需的位置参数:'w'

类型错误:get() 缺少 1 个必需的位置参数:'index1'