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
。
查看更多信息:
- python2: https://docs.python.org/2/library/functions.html#sorted
- python3: https://docs.python.org/3/library/functions.html#sorted
要了解 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()
是就地破坏性操作。
我是 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
。
查看更多信息:
- python2: https://docs.python.org/2/library/functions.html#sorted
- python3: https://docs.python.org/3/library/functions.html#sorted
要了解 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()
是就地破坏性操作。