我有一个python struct
格式的字符串,我想将它分成多个对struct.pack_into
的调用,如下所示:
buff = bytearray()
fmt = "!BBi4sVi3s"
args = [1, 0, 4, "abcd", 6, 3, "abc"]
offset = 0
fmt_parts = fmt.split("V")
for fmt_part in fmt_parts:
struct.pack_into(fmt_part, buff, offset, *args)
offset += struct.calcsize(fmt_part)
这是行不通的,因为args
列表每次都会通过循环完整地传递,尽管每次调用只关心该列表的子列表。
在给定格式字符串的情况下,有没有一种方法可以精确地找出使用该格式字符串调用args
会消耗struct.pack_into
列表中的多少个参数?同样重要的一点是,解决方案应尽可能地具有高性能。
我已经尝试过类似的事情
# every format char that doesn't consume an arg, per the struct docs
NOARG_STRUCT_FMTS = re.compile(r'[^xcbB\?hHiIlLqQfdspP]')
stripped_fmt_part = re.sub(NOARG_STRUCT_FMTS, '', fmt_part)
part_args = [args.pop(0) for _ in range(len(stripped_fmt_part))]
但是这种方法可能不可靠或比最佳方法慢。
其他上下文:我正在尝试将自定义格式字符V
添加到struct.pack_into
的功能中,以使参数被编码为varint
。我知道已经有varint
编码/解码的python实现,但是我想使自己的与struct.pack_into
定义的接口兼容,我没有在社区。 p>