【问题标题】:Passing list of tuples to function arguments without modifying function definition将元组列表传递给函数参数而不修改函数定义
【发布时间】:2020-12-08 12:47:06
【问题描述】:

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

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],但是我想知道有没有通常是一个更优雅的解决方案,我可以做这样的事情

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

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

【问题讨论】:

  • 这似乎是XY problem。为什么你认为你需要这样做?
  • @AryaMcCarthy 嗨,因为函数来自一个包。
  • 如果我们看到函数签名,那可能会有所帮助。总是三元组吗?
  • @AryaMcCarthy 我正在使用的具体函数是 cv2.rectangle。是的,参数列表中有 3 个元组。当然我可以只传入arr[0]、arr[1]、arr[2],但是我想知道对于具有更多元组的函数是否有更优雅的解决方案。
  • 你的意图不清楚。您能否编辑您的问题以显示您关心的具体情况?

标签: python-3.x list function


【解决方案1】:

当您说您需要使用不同的值多次调用它时,执行此操作的自然方法是遍历您需要提供的值集。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2016-03-11
    • 2018-03-13
    相关资源
    最近更新 更多