我正在学习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:])