Python:如何从元组切片而不是元组传递元组元素



我正在学习Python,还没有完全了解如何在函数调用中处理arg数组。这就是我的问题所在:我正在将一个切片从一个元组传递到一个函数中,期望该函数会看到多个参数,但它只看到一个参数。我不清楚这是否是我需要在调用函数中使用的正常模式,或者我是否应该做一些不同的事情。

在我的项目中,我正在解析二进制文件格式(OpenType 字体文件(。该格式是许多不同结构类型的复杂树:一些结构由struct.unpack支持的基本二进制类型组成,但有些结构的成员本身就是复杂结构。因此,我正在创建一个处理这些的模式,其中使用整个复杂结构的格式字符串调用struct.unpack,然后将返回值的切片传递给成员结构类型进行解释。

例如,对于给定的表类型(我们称之为Foo(,组合格式字符串将'>HHH2H'Foo中处理该类型解析的方法知道它分为两个成员,一个 uint16 后跟一个结构。(因此,格式字符串是">H"">HH2H"的组合。对struct.unpack的调用返回了一个包含 5 个元素的元组。其中四个元素的切片将传递给成员类型中的方法,供其解释。

下面是一个特定案例的这段代码:

vals = struct.unpack(
PaintFormat1._packedFormat,
fileBytes[:PaintFormat1._packedSize]
)
color = ColorIndex.interpretUnpackedValues(vals[1:])

PaintFormat1._packedFormat是整个复杂结构的格式字符串,'>HHH2H'.fileBytes是从PaintFormat1结构的开头开始的字节序列。

现在,我用签名定义了ColorIndex.interpretUnpackedValues方法,如下所示:

def interpretUnpackedValues(*vals):
assert len(vals) == ColorIndex._numUnpackedValues

ColorIndex._numUnpackedValues是预期的参数数。问题是vals[1:](从调用上下文中(作为元组传递,而不是作为元组的元素传递。因此,例如,在一个调用中,收到的参数是((17, 0, 0, 0),),而不是(17, 0, 0, 0)。因此,len(vals)为 1,断言被触发。

另一种说法:我希望使用len(vals)而不是len(vals[0])来编写断言。然后访问各个值作为vals[0]vals[1]等,而不是vals[0][0]vals[0][1]...

如何调用以便传递多个参数而不是单个元组?

还是应该重写函数定义以期望单个元组并访问该函数中的成员元素?

(这将是我在很多地方使用的反复出现的模式,所以我想理解并保持代码尽可能简单易读。

您可以使用*运算符来解压缩参数:

ColorIndex.interpretUnpackedValues(*vals[1:])

最新更新