【问题标题】:Calling Python method with two defined parameters, but passing only one variable使用两个定义的参数调用 Python 方法,但只传递一个变量
【发布时间】: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


【解决方案1】:

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

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

除了 metric 不作用于“点”并且与称为 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....

但是由于有装饰器,您还可以使用shape 调用函数area。这是因为在做任何事情之前,metric 被调用并且shape 被重新排列,所以area 仅在两个“点”上被调用。所以你需要做的是找到shape 是什么,然后用它调用centroid。我不愿意深入挖掘shape 到底是什么或如何让代码正常工作,所以如果其他人提取代码并对其进行测试,你需要接受他的回答。

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

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

【讨论】:

    【解决方案2】:

    您的函数area(prev, nxt) 接受两个参数,但是在您的centroid(points) 函数中,您将变量a 分配为area(prev, nxt) 函数的结果,但您只传递了一个参数,即points.

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

    【讨论】:

    • 你并不完全正确,因为函数 area 有一个装饰器,它会用两个参数调用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多