Python struct.pack() для отдельных элементов в списке? - программирование

Python struct.pack() для отдельных элементов в списке?

Я хотел бы упаковать все данные в списке в один буфер для отправки через сокет UDP. Список относительно длинный, поэтому индексирование каждого элемента в списке является утомительным. Это то, что у меня есть до сих пор:

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

Но я хотел бы сделать что-то большее, чем pythonic, что не требует, чтобы я менял вызов, если бы добавил в список больше элементов... что-то вроде:

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

Есть ли хороший способ сделать это?

4b9b3361

Ответ 1

Да, вы можете использовать синтаксис вызова *args.

Вместо этого:

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

... сделайте следующее:

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

См. Распаковка списков аргументов в учебнике. (Но на самом деле, прочитайте весь раздел 4.7, а не только 4.7.4, или вы не будете знать, что "Обратное положение..." имеет в виду...) Коротко:

... когда аргументы уже находятся в списке или кортеже, но их нужно распаковать для вызова функции, требующей отдельных позиционных аргументов... напишите вызов функции с помощью * -оператора, чтобы распаковать аргументы из списка или кортежа...