Python TypeError:sort()不接受任何位置参数

时间:2019-03-25 18:12:33

标签: python class arguments

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

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。这里有什么问题?

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

确切地说:sort不接受任何位置参数。它采用名为key的仅关键字参数:

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

来自documentation

  

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

     

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

     

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

     

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

     

[...]

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

答案 2 :(得分:1)

sort()接受一个key参数,而别无其他(嗯,它可以接受一个reverse参数)。您为sort()提供了不能接受的参数。只需在您的key=之前添加一个lambda

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