【发布时间】:2017-06-11 19:25:19
【问题描述】:
我很难理解以下代码 sn-p:
@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 是某种二维数组/列表,其中每个项目都包含一对 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'
我在这里遗漏了什么还是这段代码根本无法以这种方式运行?
【问题讨论】:
-
您使用的数组,它们是什么类型的。长度形状等..?
-
@ljetibo 示例性方法调用与上次编辑一起添加
-
@ljetibo 所以
@metric是由函数def metric(function)定义的,并且每次在“注释”(装饰?)函数本身执行之前执行?然后带注释的函数接收metric(function)的返回值作为参数? -
装饰器通常是这样工作的,他们接受一个函数,做一些事情然后调用这个函数。它们返回一个函数,因此当您启动程序时,您装饰的函数会被这个同名的新函数“替换”,但在调用原始函数之前也会做一些事情。 see this
-
嗯,这是我以前不知道的。现在我想,我将能够理解整个代码。如果你写一个答案,我会接受它。谢谢!
标签: python methods syntax parameters