【问题标题】:Python TypeError: sort() takes no positional argumentsPython TypeError: sort() 没有位置参数
【发布时间】:2019-08-16 01:36:39
【问题描述】:

我尝试写一个小班,想根据重量对项目进行排序。代码已提供,

class Bird:

    def __init__(self, weight):
        # __weight for the private variable
        self.__weight = weight

    def weight(self):
        return self.__weight

    def __repr__(self):
        return "Bird, weight = " + str(self.__weight)


if __name__ == '__main__':

    # Create a list of Bird objects.
    birds = []
    birds.append(Bird(10))
    birds.append(Bird(5))
    birds.append(Bird(200))

    # Sort the birds by their weights.
    birds.sort(lambda b: b.weight())

    # Display sorted birds.
    for b in birds:
        print(b)

当我运行程序时,我得到了Python TypeError: sort() takes no positional arguments 的错误堆栈。这里有什么问题?

【问题讨论】:

  • 这个错误实际上是针对 python3 的。 Python2 会假设给 sort 的函数是 cmp 函数。上面的代码仍然会因为你给它一个键功能而中断。我发现这个 Q 是因为我的 python2 脚本在 python3 下运行时损坏了。

标签: python python-3.x class sorting arguments


【解决方案1】:

正如它所说的那样:sort 不接受任何位置参数。它接受一个名为 key 的纯关键字参数:

birds.sort(key=lambda b: b.weight())

来自documentation

排序(*, key=None, reverse=False)

此方法对列表进行就地排序, 仅使用 < 项目之间的比较。异常不会被抑制 - 如果任何比较操作失败,整个排序操作都会失败(并且列表可能会处于部分修改状态)。

sort() 接受两个只能通过关键字传递的参数 (仅关键字参数):

key 指定一个参数的函数,用于从每个列表元素中提取比较键(例如,key=str.lower)。列表中每一项对应的键计算一次,然后用于整个排序过程。默认值None表示列表项直接排序,不计算单独的key值。

[...]

签名中的*是位置参数和关键字参数的分隔符;它作为初始“参数”的位置表明缺少位置参数。

【讨论】:

  • 这样是有历史原因的。在早期的 python 中,需要一个 cmp 函数。在某些时候添加了传递键函数而不是 cmp 函数的可能性。在 python3 中删除了通过 cmp 函数的可能性。为了确保旧的 python2 脚本(将 cmp 函数作为位置参数传递)不会因更模糊的错误而中断,sort 不再接受位置参数。
【解决方案2】:

查看list.sort 的文档,我们可以看到key 是一个仅限关键字的参数。所以换行

birds.sort(lambda b: b.weight())

birds.sort(key=(lambda b: b.weight()))

【讨论】:

  • 您不需要括号作为密钥。只需key=lambda b: b.weight() 就足够了。
  • @alec935 我不敢苟同。看看chepner的答案。没有多余的括号更容易阅读,而且它做同样的事情。如果 OP 在sort 之前嵌套了更多代码,那么有多少右括号太多了?
【解决方案3】:

sort() 接受 key 参数,没有别的(好吧,它可以接受 reverse 参数)。您向 sort() 提供了它无法接受的参数。只需在 lambda 之前添加一个 key=

错误消息是因为key 采用关键字参数,而不是位置参数。位置参数是一个不跟等号和默认值的名称。

【讨论】:

    猜你喜欢
    • 2010-12-30
    • 2014-09-24
    • 2019-05-17
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多