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



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

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.矩形,它在图像上绘制一个矩形。参数列表中有3个元组:(x1,y1(、(x2,y2(和RGB值的元组,例如(255,0,0(。因为我需要用不同的值多次调用这个cv2.矩形函数,所以我将这些值存储在一个字典中,如下所示:

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.矩形函数,我当然可以传入params[key1][0]、params[key1][1]、params[cey1][2],但我想知道是否有一个更优雅的解决方案,在那里我可以做之类的事情

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

最新更新