sti*_*lls 2 python sorting snapshot amazon-ec2 amazon-web-services
我对 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()
Run Code Online (Sandbox Code Playgroud)
当使用 sort 对快照进行排序时,我调用了一个函数来比较日期以找出最新和最旧的快照。当 snapshots.sort(key=date_compare) 运行时,我收到以下错误:
snapshots.sort(key=date_compare)
TypeError: date_compare() missing 1 required positional argument: 'snap2'
Run Code Online (Sandbox Code Playgroud)
很确定我在做一些非常基本的错误,但真的很感激一些帮助来完成这项工作。谢谢!
您的函数date_compare需要两个参数,def date_compare(snap1, snap2)但排序函数只会将一个参数传递给提供给的函数,而key不是两个项目。该key关键字用来告诉哪个字段添加到对象中比较排序; 它并不用于实际比较两个不同的对象。您想使用cmp关键字来传递自定义比较函数。很确定您只是想使用cmp关键字而不是key.
请参阅此了解更多信息:
为了理解key函数应该如何工作,让我们举一个更简单的例子来看看它是如何工作的。假设我有一个元组列表:
>>> my_data = [(0, 'Z',), (1, 'Y',), (2, 'W')]
Run Code Online (Sandbox Code Playgroud)
如果我只是对这些数据进行排序,我会得到:
>>> sorted(my_data)
[(0, 'Z'), (1, 'Y'), (2, 'W')]
Run Code Online (Sandbox Code Playgroud)
但是,如果我想对元组的第二项进行排序,我可以编写一个简单的函数,如下所示:
>>> def get_second(item):
... return item[1]
>>>
>>> sorted(my_data, key=get_second)
[(2, 'W'), (1, 'Y'), (0, 'Z')]
Run Code Online (Sandbox Code Playgroud)
所以现在它对第二个项目进行排序。请注意,通常使用一个简单的 lambda 函数来完成以下操作:
>>> sorted(my_data, key=lambda item: item[1])
[(2, 'W'), (1, 'Y'), (0, 'Z')]
Run Code Online (Sandbox Code Playgroud)
这使您不必事先定义这样的简单函数。
要使用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')]
Run Code Online (Sandbox Code Playgroud)
最后,请注意,sorted(seq)与seq.sort()-- 使用相同的参数、kwargs 等相同。 Justsorted是副本,而是seq.sort()就地破坏性操作。
| 归档时间: |
|
| 查看次数: |
3232 次 |
| 最近记录: |