Python TypeError:sort()不带位置参数

问题描述 投票:1回答:3

我尝试写一个小班,并希望根据重量对项目进行排序。代码是提供的,

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的错误堆栈。这是什么问题?

python class arguments
3个回答
4
投票

正是它所说的:sort不采取任何位置论证。它需要一个名为key的仅关键字参数:

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

来自documentation

sort(*,key = None,reverse = False)

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

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

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

[...]

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


5
投票

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

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

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


2
投票

sort()采取key论点,没有别的(好吧,它可以采取reverse论点)。你向sort()提供了一个它无法接受的论据。只需在key=之前添加一个lambda

错误消息是因为key接受关键字参数,而不是位置参数。位置参数是一个名称,后面没有等号和默认值。

© www.soinside.com 2019 - 2024. All rights reserved.