使用两个定义的参数调用Python方法,但只传递一个变量

使用两个定义的参数调用Python方法,但只传递一个变量,python,methods,syntax,parameters,Python,Methods,Syntax,Parameters,我正在努力理解以下代码片段: @metric def area(prev, nxt): """Area of a polygon with points in clockwise order.""" return area_piece(prev, nxt) / 2 def centroid(points): a = area(points) return [center_x_helper(points)/a, center_y_helper(points)/a]

我正在努力理解以下代码片段:

@metric
def area(prev, nxt):
    """Area of a polygon with points in clockwise order."""
    return area_piece(prev, nxt) / 2

def centroid(points):
    a = area(points)
    return [center_x_helper(points)/a, center_y_helper(points)/a]

@metric
def center_x_helper(prev, nxt):
    return (prev[0] + nxt[0]) * area_piece(prev, nxt) / 6

@metric
def center_y_helper(prev, nxt):
    return (prev[1] + nxt[1]) * area_piece(prev, nxt) / 6

def area_piece(prev, nxt):
    return nxt[0] * prev[1] - prev[0] * nxt[1]
完整代码位于

我假设
是某种2D数组/列表,其中每个项包含一对X坐标和Y坐标。无论如何,
被传递到
区域(prev,nxt)
以对每对坐标执行计算

当我尝试下列方法之一时

centroid([[150200]、[0300]、[0400]、[3,1]])

质心([150,200,0,300,0,400,3,1])

我得到这个错误:

TypeError:area()缺少1个必需的位置参数:“nxt”

我是在这里遗漏了什么还是这段代码不能这样运行?

你的函数
区域(prev,nxt)
有两个参数,但是在
质心(points)
函数中,你分配了一个变量
a
作为
区域(prev,nxt)
函数的结果,但你只传递了一个参数,即

def centroid(points):
    a = area(points, secondArgumentNeedsToGoHere)

我认为,您遇到的问题是发送列表的格式不正确

我不知道完整代码中的
形状
来自何处。调用
质心
时发生的情况是调用
区域
。但在实际执行区域之前,将调用decorator
metric
(原始代码中的第77行)<代码>度量然后重新排列被称为
的输入列表(第85、86行),然后在这些重新排列的列表上调用原始函数
区域

除此之外,metric不作用于“点”并与名为
形状的东西一起工作,我找不到它的定义,但必须在原始代码中的某个地方。
shape
有很多方法不属于列表的一部分,例如
.points
.parts
.tolist

对于
区域
您需要发送两个“点”,它们似乎只是长度为2的列表,如:
区域([1,2],[4,5])
。我基于他的docstring text
函数应该取两点(每个列表的长度为2)并返回一些…

但是由于使用了decorator,您还可以使用
shape
调用函数
area
。这是因为在执行任何操作之前,
metric
会被调用,而
shape
会被重新安排,以便只在两个“点”上调用
area
。因此,您需要做的是找到
形状
是什么,然后用它调用
形心
。我不愿意深入挖掘,以找到确切的
shape
是什么,或者如何使代码正常工作,因此,如果其他人提取代码并测试它,您需要接受他的答案

另外,你可以考虑装饰者通常是如何接受一个函数的,可能在函数之前做一些事情,然后调用函数,然后在函数之后做一些事情。它们返回一个函数,这样当你启动程序时,你修饰的函数会被这个同名的新函数“替换”,但这也可能会做一些其他的事情。有关装饰器的更多信息,请参阅


对于后人-这是在评论中,经过编辑,以符合答案的形式,之后评论被删除。我也喜欢点。

你不完全正确,因为函数
区域
有一个装饰器,它将用两个参数调用它。你使用的数组,它们是什么类型的。长度形状等?@ljetibo示例性方法调用添加了lastedit@ljetibo那么
@metric
是由函数
def metric(function)
定义的,并且在每次执行“带注释”(修饰的?)函数之前执行?然后,带注释的函数将
metric(function)
的返回值作为参数接收?这通常是装饰程序的工作方式,他们接收一个函数,做一些事情,然后调用该函数。它们返回一个函数,这样当您启动程序时,您修饰的函数将被这个同名的新函数“替换”,但这也会在调用原始函数之前执行一些操作。这是我以前不知道的。现在我想,我将能够理解整个代码。如果你写一个答案,我会接受的。谢谢