Python using sort with function gives TypeError: date_compare() missing 1 required positional argument: error

Python using sort with function gives TypeError: date_compare() missing 1 required positional argument: error

我是 Python 的新手,所以请原谅我的知识不足。我正在编写一个脚本来创建 AWS EC2 快照,然后删除脚本中指定的任何旧快照。我从其他脚本中获取了一些代码,这些代码似乎是用较旧的 Python 版本编写的(我使用的是 3.3.2)。

#Built with Python 3.3.2
import boto.ec2
from boto.ec2.connection import EC2Connection
from boto.ec2.regioninfo import RegionInfo
from boto.ec2.snapshot import Snapshot
from datetime import datetime
import sys

aws_access_key = str(input("AWS Access Key: "))
aws_secret_key = str(input("AWS Secret Key: "))
regionname = str(input("AWS Region Name: "))
regionendpoint = str(input("AWS Region Endpoint: "))
region = RegionInfo(name=regionname, endpoint=regionendpoint)
conn = EC2Connection(aws_access_key_id = aws_access_key, aws_secret_access_key = aws_secret_key, region = region)
print (conn)

volumes = conn.get_all_volumes()
print ("%s" % repr(volumes))

vol_id = str(input("Enter Volume ID to snapshot: "))
keep = int(input("Enter number of snapshots to keep:  "))
volume = volumes[0]
description = str(input("Enter volume snapshot description: "))


if volume.create_snapshot(description):
    print ('Snapshot created with description: %s' % description)

snapshots = volume.snapshots()
print (snapshots)

def date_compare(snap1, snap2):
    if snap1.start_time < snap2.start_time:
        return -1
    elif snap1.start_time == snap2.start_time:
        return 0
    return 1

snapshots.sort(key=date_compare)
delta = len(snapshots) - keep
for i in range(delta):
    print ('Deleting snapshot ') + snapshots[i].description
    snapshots[i].delete()

当使用排序对快照进行排序时,我调用了一个函数来比较日期以找出最新和最旧的快照。当 snapshots.sort(key=date_compare) 运行时出现以下错误:

    snapshots.sort(key=date_compare)
TypeError: date_compare() missing 1 required positional argument: 'snap2'

很确定我做错了一些非常基本的错误,但非常感谢您提供帮助以使其正常工作。谢谢!

你的函数 date_compare 有两个参数,def date_compare(snap1, snap2)——但是排序函数只会将一个参数传递给提供给 key 的函数——而不是两个项目。 key 关键字用于告诉 sort 在对象中比较哪个字段;它不用于实际比较两个不同的对象。您想要使用 cmp 关键字来传递自定义比较函数。很确定您只是想使用 cmp 关键字而不是 key

查看更多信息:

要了解 key 函数的工作原理,让我们举一个更简单的例子来看看它是如何工作的。假设我有一个元组列表:

>>> my_data = [(0, 'Z',), (1, 'Y',), (2, 'W')]

如果我只是对这些数据进行排序,我会得到:

>>> sorted(my_data)
[(0, 'Z'), (1, 'Y'), (2, 'W')]

但是,如果我想对元组的第二项进行排序,我可以编写一个简单的函数,如下所示:

>>> def get_second(item):
...    return item[1]
>>>
>>> sorted(my_data, key=get_second)
[(2, 'W'), (1, 'Y'), (0, 'Z')]

现在正在对第二项进行排序。请注意,通常使用一个简单的 lambda 函数来完成这样的事情:

>>> sorted(my_data, key=lambda item: item[1])
[(2, 'W'), (1, 'Y'), (0, 'Z')]

这样您就不必事先定义一个像这样的简单函数。

要使用 cmp 关键字完成相同的排序,它的工作原理如下:

>>> def compare(left, right):
...     if left[1] < right[1]:
...         return -1
...     elif left[1] == right[1]:
...         return 0
...     else:
...         return 1
>>> sorted(my_data, cmp=compare) 
[(2, 'W'), (1, 'Y'), (0, 'Z')]

最后,请注意,sorted(seq)seq.sort() 相同——采用相同的 args、kwargs 等。只是 sorted 是一个副本,而 seq.sort()是就地破坏性操作。