2015-03-04 2 views
-1

Je suis complètement nouveau à Python alors s'il vous plaît excusez mon manque de connaissances. J'écris un script pour créer des snapshots AWS EC2, puis supprimer tous les instantanés plus anciens spécifiés dans le script. J'ai pris du code d'autres scripts qui semblent avoir été écrits dans une ancienne version de Python (j'utilise 3.3.2).Python en utilisant trier avec fonction donne TypeError: date_compare() manquant 1 requis positional argument: erreur

#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() 

Lorsque vous utilisez tri pour commander les clichés que je fais appel une fonction de comparer les dates pour travailler sur ce qui est le plus récent et les plus anciens clichés. Lorsque snapshots.sort (key = date_compare) fonctionne, je reçois l'erreur suivante:

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

assez sûr que je suis en train de faire quelque chose de mal, mais très basique apprécierais vraiment un peu d'aide pour obtenir ce travail. Merci!

Répondre

0

votre fonction date_compare prend deux arguments, def date_compare(snap1, snap2) - mais la fonction de tri ne transmettra jamais qu'un argument à la fonction fournie à key - pas deux éléments. Le mot-clé key permet de trier sur quel champ comparer dans un objet; il n'est pas utilisé pour comparer deux objets différents. Vous souhaitez utiliser le mot clé cmp pour passer une fonction de comparaison personnalisée. Assez sûr que vous voulez juste utiliser le mot-clé cmp au lieu de key.

Voir ce pour plus:

Pour comprendre la façon dont la fonction key devrait fonctionner, nous allons prendre un exemple plus simple pour voir comment cela fonctionne. Disons que j'ai une liste de tuples:

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

Si je trier simplement ces données je reçois:

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

Cependant, si je veux trier sur le deuxième élément du tuple, je peux écrire une simple fonction comme celle-ci:

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

Maintenant, c'est le tri sur le second élément. Remarque, souvent une simple fonction lambda est utilisée pour accomplir des choses comme ceci:

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

qui vous évite d'avoir à définir une fonction simple comme ça avant la main.

Pour utiliser le mot-clé cmp pour accomplir le même tri cela fonctionne comme ceci:

>>> 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')] 

dernier, juste noter sorted(seq) est le même que seq.sort() - prend les mêmes args, kwargs, etc. Juste sorted est une copie alors que seq.sort() est une opération destructive sur place.

+0

Merci J'ai effectivement travaillé autour de cela en utilisant une fonction pour convertir cmp en clé en faisant ceci: à partir de functools importer des snapshots cmp_to_key.sort (clé = cmp_to_key (date_compare)) cela a fonctionné mais basé sur ce que vous avez mentionné ci-dessus, je pourrais juste remplacer key = avec cmp = et qui permettrait d'atteindre le même résultat ?? – stickells

+0

Je pense que le simple changement de 'key' en' cmp' est plus standard, plus simple. Pouvez-vous upvote et accepter ma réponse? –

+0

pas de problèmes, réponse acceptée, seulement créé mon compte afin que mon représentant ne me permet pas de voter pour le moment. Merci!! – stickells