Question Python struct.pack () pour des éléments individuels dans une liste?


Je voudrais emballer toutes les données dans une liste dans un seul tampon pour envoyer sur un socket UDP. La liste est relativement longue, il est donc fastidieux d’indexer chaque élément de la liste. C'est ce que j'ai jusqu'à présent:

NumElements = len(data)
buf = struct.pack('d'*NumElements,data[0],data[1],data[2],data[3],data[4])

Mais je voudrais faire quelque chose de plus pythonique qui ne nécessite pas de changer l'appel si j'ai ajouté plus d'éléments à la liste ... quelque chose comme:

NumElements = len(data)
buf = struct.pack('d'*NumElements,data)  # Returns error

Y a-t-il un bon moyen de le faire?


13
2018-05-03 22:05


origine


Réponses:


Oui, vous pouvez utiliser le *args appeler la syntaxe.

Au lieu de cela:

buf = struct.pack('d'*NumElements,data)  # Returns error

... fais ceci:

buf = struct.pack('d'*NumElements, *data) # Works

Voir Déballage des listes d'arguments dans le tutoriel. (Mais vraiment, lisez toute la section 4.7, pas seulement 4.7.4, ou vous ne saurez pas ce que "La situation inverse ..." se réfère à ...) En bref:

... quand les arguments sont déjà dans une liste ou un tuple mais doivent être décompressés pour un appel de fonction nécessitant des arguments positionnels séparés ... écrivez l'appel de fonction avec l'opérateur * pour décompresser les arguments d'une liste ou d'un tuple ...


15
2018-05-03 22:09