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

时间:2017-01-26 10:33:00

标签: 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 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]

完整代码位于here

我假设points是某种2D数组/列表,其中每个项目包含一对X和Y坐标。但不知怎的,points被传递给area(prev, nxt)以对每对坐标执行计算。

当我尝试以下其中一项时

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

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

我收到此错误:

TypeError: area() missing 1 required positional argument: 'nxt'

我在这里遗漏了一些东西,或者这段代码是不是以这种方式运行?

2 个答案:

答案 0 :(得分:1)

我相信,您遇到的问题不是以正确的格式发送列表。

我不知道shape来自的完整代码。调用centroid时会发生什么?area被调用。但是在实际执行区域之前,会调用装饰器metric(原始代码中的第77行)。 metric然后重新排列名为points的输入列表(第85,86行),然后在这些重新排列的列表上调用原始函数area

除了度量标准不对“点”起作用并且使用名为shape的东西时,我找不到它的定义,但必须在原始代码中的某个位置。有很多方法shape不属于列表的一部分,例如.points.parts.tolist等等。

对于area,您需要发送两个“点”,这些点似乎只是长度为2的列表,如:area([1,2], [4,5])。我的基础是他的文档字符串function should take two points (each lists of length 2) and return some....

但是由于装饰器,您还可以使用area调用函数shape。这是因为在完成任何操作之前,会调用metric并重新安排shape,以便仅在两个“点”上调用area。所以你需要做的是找到shape是什么,然后用它来调用centroid。我不愿意深入挖掘究竟shape究竟是什么或如何使代码正常工作,所以如果其他人拉代码并测试它,你需要接受他的答案。

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

对于后代 - 这是在评论中,并进行了一些编辑,以适应答案的形式,之后评论被删除。我也喜欢积分。

答案 1 :(得分:0)

您的函数area(prev, nxt)有两个参数,但是在centroid(points)函数中,您将变量a指定为area(prev, nxt)函数的结果,但是您'只传递一个参数,即points

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