我想调用一个接受元组作为其参数一部分的函数,即该函数的调用方式如下:
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] 删除。
我来说两句