将元组列表传递给函数参数而不修改函数定义

骑车

我想调用一个接受元组作为其参数一部分的函数,即该函数的调用方式如下:

foo('Hello', (x1, x2), (y1, y2), (z1, z2))

我有一个元组列表如下:

arr = [(1, 1), (2, 2), (3, 3)]

调用函数foo("Hello", *arr)(如许多在线答案所建议的)不起作用。它给出了错误:TypeError: foo() missing 2 required positional arguments: 'y' and 'z'

无法修改函数定义,即我不能将其更改为foo("Hello", *arg).


编辑:我使用的特定函数是 cv2.rectangle,它在图像上绘制一个矩形。参数列表中有 3 个元组:(x1, y1), (x2, y2) 和一个 RGB 值元组,例如 (255, 0, 0)。因为我需要用不同的值多次调用这个 cv2.rectangle 函数,所以我将这些值存储在这样的字典中:

params = {
    key1: [(10, 10), (60, 30), (255, 0, 0)],
    key2: [(15, 15), (65, 35), (255, 100, 255)],
    key3: [(20, 20), (70, 40), (255, 0, 0)],
    key4: [(25, 25), (75, 45), (255, 100, 0)],
    key5: [(30, 30), (80, 50), (0, 100, 0)],
    key6: [(35, 35), (85, 55), (255, 0, 0)],
    key7: [(40, 40), (90, 60), (0, 100, 0)],
    key8: [(45, 45), (95, 65), (0, 100, 255)],
    key9: [(50, 50), (100, 70), (255, 0, 0)],
    key10: [(55, 55), (105, 75), (255, 100, 0)]
}

调用cv2.rectangle函数,当然可以直接传入params[key1][0],params[key1][1],params[key1][2],但是我想知道一般有没有more优雅的解决方案,我可以做这样的事情

cv2.rectangle(..., *params[key1], ...)

任何帮助,将不胜感激。谢谢!

艾莉亚·麦卡锡

当你说你需要用不同的值多次调用它时,这样做的自然方法是循环你需要提供的值集。

image = ...  # The first argument to cv2's `rectangle` function
for key, values in params.items():
    assert isinstance(values, list)  # Just checking!
    cv2.rectangle(image, *values)

在无法访问您的特定数据(一个最小的可重复示例)的情况下,我创建了自己的数据以证明这是有效的。

In [1]: def foo(a, b, c, d, e=True, f="hi"): 
   ...:     print(a, b, c, d, e, f) 
   ...:                                                                         

In [2]: params = {"one": ['b', 'bee', 'beta'], "two": ['g', 'gee', 'gamma']}    

In [3]: for key, values in params.items(): 
   ...:     foo("hello!", *values, False) 
   ...:                                                                         
hello! b bee beta False hi
hello! g gee gamma False hi

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章