【问题标题】:Is it possible to pass an unknown amount of variables, via a single variable, into a function call that uses args and kwargs? [duplicate]是否可以通过单个变量将未知数量的变量传递给使用 args 和 kwargs 的函数调用? [复制]
【发布时间】:2020-11-17 22:25:34
【问题描述】:

是否可以通过单个变量将未知数量的变量传递给函数调用?

我遇到的问题是我正在迭代一个数据帧,每一行都将使用一个位串 pack 函数调用 - 每个调用可能有不同数量的参数,具体取决于列表的长度 row['Data']

for index, row in log_file.iterrows():
    pack_string = 'u1u11u1u1u1u4{}'.format('u8'*len(row['Data']))
    packed = bitstruct.pack(pack_string, 0, row['ID'], 0, 0, 0, len(row['Data']),)

pack_string 的示例可能如下所示:

u1u11u1u1u1u4u8u8u8
u1u11u1u1u1u4u8u8u8u8u8u8
u1u11u1u1u1u4u8u8
u1u11u1u1u1u4u8u8u8u8u8u8u8u8

对于每个 u8,我需要将一个新变量传递给 bitstruct.pack() 方法。因此,对于 pack_string u1u11u1u1u1u4u8u8 上的单个循环,解决方案是:

pack_string = 'u1u11u1u1u1u4{}'.format('u8'*len(row['Data']))
packed = bitstruct.pack(pack_string, 0, row['ID'], 0, 0, 0, len(row['Data']), row['Data'][0], row['Data'][1])

改变参数数量的理想解决方案可能如下所示:

for index, row in log_file.iterrows():
    pack_string = 'u1u11u1u1u1u4{}'.format('u8'*len(row['Data']))
    *args = row['Data']
    packed = bitstruct.pack(pack_string, 0, row['ID'], 0, 0, 0, len(row['Data']), *args)

【问题讨论】:

  • 你可以传*row['Data']
  • 你已经很接近了 - 它应该是 args = row['Data'] 你这样做的方式,你不需要这样的临时(你可以在函数调用中直接使用 *row['Data'] )。
  • 如果你们中的任何一个想提交和回答,我很乐意接受。谢谢你们!
  • 我已经关闭了问题,但您仍然可以接受答案

标签: python python-3.x


【解决方案1】:

您可以使用“splat”运算符将任意可迭代对象解压缩为单个参数:

for index, row in log_file.iterrows():
    pack_string = 'u1u11u1u1u1u4{}'.format('u8'*len(row['Data']))
    packed = bitstruct.pack(pack_string, 0, row['ID'], 0, 0, 0, len(row['Data']), *row['Data'])

您上次尝试的唯一问题是 *args = row['Data'] 应该只是

args = row['Data']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2013-07-26
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多