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

Are*_*efe 3 python arguments class

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

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)
Run Code Online (Sandbox Code Playgroud)

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

che*_*ner 5

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

birds.sort(key=lambda b: b.weight())
Run Code Online (Sandbox Code Playgroud)

文档中

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

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

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

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

[...]

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

  • 之所以会这样,是有历史原因的。在早期的 python 中,cmp 函数是被期望的。在某个时候添加了传递 key 函数而不是 cmp 函数的可能性。python3 中删除了传递 cmp 函数的可能性。为了确保旧的 python2 脚本(将 cmp 函数作为位置参数传递)不会因更模糊的错误而中断,sort 不再接受位置参数。 (3认同)

cwi*_*olf 5

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

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

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

  • 不过,您不需要密钥的括号。只需`key=lambda b: b.weight()` 就足够了。 (3认同)