2010-07-14 11 views
2

Je tente de stocker une liste de commandes pour envoyer un câble série en utilisant deque en Python.Utilisation de Deque.popleft comme arguments pour la fonction

Ma fonction "send_command" accepte 3 valeurs; La commande, un int. pause et une attente booléenne. sa définition est la suivante.

def send_command(self, command, pause=0, wait=False): 

Ce que je voudrais faire est, plutôt que d'appeler cette fonction comme ceci:

send_command("A234", 5, True) 

... ou ...

send_command("B4242") 

J'aimerais pour pouvoir stocker des commandes dans une liste de deque et utiliser la fonction popleft pour ensuite appeler ma fonction. Cela me permettrait de faire des choses telles que:

CommandList = deque((['A234', 5, True], ['B4242'])) 

... et utiliser le deque.append() comme un moyen de continuer à ajouter des choses à la liste, qui à son tour envoyé à ma fonction send_command . Je pourrais alors laisser tomber dans et hors de la liste de nouvelles commandes quand elles sont nécessaires (ou aussi rapidement que la partie sérielle de mon code peut faire).

La partie avec laquelle je me bats est en fait en utilisant CommandList.popleft, ou n'importe quelle partie de la liste de deque en tant qu'args pour ma fonction send_command. Il ne semble pas aussi simple que:

send_command(CommandList.popleft) 

Je suis sûr que c'est quelque chose de simple, mais je ne peux pas le comprendre.

Quelqu'un peut-il aider?

Merci beaucoup.

Andy

Répondre

3

probablement vous besoin de quelque chose comme:

obj.send_command(*CommandList.popleft()) 

C'est, appelez popleft et utiliser le résultat comme une liste d'arguments pour send_command. self argument suggère que c'est une fonction membre, vous devez donc l'appeler sur un objet

Une autre façon, comme je l'ai écrit dans le commentaire, est de stocker des fonctions préparées avec quelque chose comme ceci:

def make_command(obj, *args, **kwargs): 
    def f(): 
     obj.send_command(*args, **kwargs) 
    return f 

Ensuite, vous pouvez faire

queue.append(make_command(obj, 'ABC', whatever='else')) 

puis exécutez:

command = queue.popleft() 
command() 
+0

Ahhha! Ce qui semble fonctionner, c'est ... self.send_command (* self.CommandList.popleft() ... Cela signifie-t-il que je ne peux plus appeler ma fonction comme ceci: send_command ("A1234", wait = True) ou existe-t-il un moyen de stocker cela dans deque? Self.CommandList.append ([ 'b23456', wait = True]) ne fonctionne pas normalement. ny idées? – Schodemeiss

+0

oui vous pouvez. Vous pouvez décompresser les listes d'arguments comme * arglist et dictionnaires avec des arguments de mot-clé avec ** argdict. Cependant, il n'y a aucun moyen de le stocker en une seule pièce, comme vous l'avez écrit. Il pourrait être plus pratique de stocker des fermetures prêtes à être appelées à la place. – unbeli

+0

voir la mise à jour pour un exemple – unbeli

0

Avez-vous essayé:

send_command(CommandList.popleft()) # note the() 
+0

Oui ... n'a pas fonctionné non plus :(Je pense que la définition de ma fonction qui est la peine si... – Schodemeiss

+0

@Andy Barlow: Désolé, je suppose que je n'ai pas assez lu la question. @ La réponse d'unbeli semble plus appropriée – MAK

1

unbeli est correct - vous avez besoin du () pour appeler la fonction, et vous avez besoin de * pour décompresser les arguments.Cependant, il n'y a pas besoin d'utiliser deque quand vous pouvez le faire:

commandlist = [['A234', 5, True], ['B4242'], ['A234', 0]] 

for command in commandlist: 
    send_command(*command) 

et qui fonctionnera parfaitement. Pour plus d'informations, voir unpacking argument lists.

Les files d'attente ne sont vraiment nécessaires que si vous voulez utiliser les valeurs, par exemple si vous voulez que votre liste de commandes soit vide lorsque vous avez terminé. Bien sûr, vous pouvez aussi faire la même chose avec une liste:

q = [1,2,3,4] 
while q: 
    print q.pop(0) 
print q 

HTH