использование * args в struct.pack - PullRequest
2 голосов
/ 22 июля 2011

Я только что прочитал о нотациях * args и ** kwargs в python и решил использовать его с моими функциями, которые используют struct.pack как таковой:

def pack_floats(*args):

   return struct.pack('%df' %len(args), args)

Но, конечно, это не работает, потому что args - это кортеж. Если бы я хотел собрать три номера, я бы назвал пакет как таковой

struct.pack('3f', 1, 2, 3)

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

Есть ли способ написать функцию pack_floats без вызова функции pack внутри цикла?

Ответы [ 3 ]

6 голосов
/ 22 июля 2011
>>> import struct
>>> def pack_floats(*args):
...     return struct.pack('%df' %len(args), *args)
... 
>>> pack_floats(0.1,1.2,2.3)
'\xcd\xcc\xcc=\x9a\x99\x99?33\x13@'
1 голос
/ 22 июля 2011

Вы можете просто использовать одну и ту же запись для передачи переменной числа аргументов в функцию:

def pack_floats(*args):
    return struct.pack('%df' % len(args), *args)  # Note the *args
1 голос
/ 22 июля 2011
def pack_floats(*args):
    return struct.pack('%df' % len(args), *args)

Вы были почти правы: вы упаковали аргументы в кортеж с помощью pack_floats(*args), и вам нужно распаковать их снова при передаче их в struct, которая использует тот же синтаксис.

...