2015-03-04 2 views
-1

Я совершенно не знаком с Python, поэтому, пожалуйста, извините за недостаток знаний. Я пишу скрипт для создания снимков AWS EC2, а затем удаляю любые старые снимки, указанные в скрипте. Я взял код из других сценариев, которые, как представляется, были написаны в более старой версии Python (я использую 3.3.2).Python, использующий сортировку с помощью функции, дает TypeError: date_compare() отсутствует 1 обязательный позиционный аргумент: ошибка

#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 (ключ = date_compare) Я получаю следующее сообщение об ошибке:

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

Довольно уверен, что я делаю что-то очень простой, но неправильно было бы очень признателен за помощь, чтобы получить эту работу. Благодаря!

ответ

0

Ваша функция date_compare принимает два аргумента: def date_compare(snap1, snap2) - но функция сортировки будет передавать только один аргумент функции key - не два элемента. Ключевое слово key используется, чтобы рассказать о том, какое поле должно сравниваться внутри объекта; он не используется для сравнения двух разных объектов. Вы хотите использовать ключевое слово 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')] 

Так что теперь это сортировка по второму пункту. Обратите внимание, что часто простой лямбда-функция используется для выполнения вещи, как это:

>>> 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() - принимает те же аргументы, kwargs, и т.д. Просто sorted является копией, тогда как seq.sort() - это деструктивная операция на месте.

+0

Спасибо, что я действительно работал над этим, используя функцию для преобразования cmp в ключ, выполнив это: из functools импортируйте моментальные копии cmp_to_key.sort (key = cmp_to_key (date_compare)), это сработало, но на основе того, что вы упомянули выше, я мог бы просто заменить key = на cmp = и это обеспечило бы тот же результат ?? – stickells

+0

Я думаю, что просто изменение 'key' на' cmp' более стандартное, прямое. Можете ли вы поддержать и принять мой ответ? –

+0

никаких проблем, ответ принят, только что создал мою учетную запись, поэтому мой представитель не позволяет мне голосовать. Благодаря!! – stickells