【问题标题】:Passing arguments to Python function as a data structure将参数作为数据结构传递给 Python 函数
【发布时间】:2020-04-01 06:37:16
【问题描述】:

我正在使用具有大量位置和命名参数的第 3 方库函数。该函数是从我的代码中的多个点调用的,具有相同的参数/值。

为了便于维护,我不想在整个代码中多次硬编码数十个相同的参数。我希望有一种方法可以将它们存储在数据结构中,所以我只需要传递数据结构。大致如下:

假设我正在调用的函数的签名如下:

def lib_function(arg1, arg2, arg3=None, arg4=None): 

假设在我的代码中我想用值来调用它

  • a 用于 arg1,
  • b 用于 arg2
  • d 用于 arg4
  • (而且我没有使用 arg3)。

我尝试过如下定义数据结构:

arguments = ('a', 'b', {'arg4':'d'})

并像这样使用它:

res = lib_function(arguments)

但这显然是不正确的 - 元组和字典在调用期间没有解包,而是作为单个第一个参数处理。

有没有办法在 Python 中做到这一点?

显而易见的替代方法是在我的代码中代理 lib_function,将参数硬编码在代理中,然后在不带参数的情况下调用该代理。比如:

def proxy_lib_function():
    return lib_function('a', 'b', arg4='d')

res = proxy_lib_function()

但是我想检查一下没有比 Pythonic 更好的方法了。

【问题讨论】:

    标签: python function arguments


    【解决方案1】:

    分离位置参数和命名参数并使用asterisk unpacking:

    def lib_function(arg1, arg2, arg3=None, arg4=None):
        print(locals())
    
    
    args = ("a", "b")
    kwargs = {"arg4": "d"}
    res = lib_function(*args, **kwargs)
    

    【讨论】:

    • 请在第一时间用文字和解释来回答,纯代码的答案并没有真正的帮助
    • 是的,它完成了这项工作。谢谢。
    • @azro,如果那家伙说它完成了这项工作,那么我想这就足够了 :)
    【解决方案2】:

    你的功能是:

     def lib_function(arg1, arg2, arg3=None, arg4=None): 
    

    定义另一个函数:

     def yourFunction(x):
        return lib_function(x[0], x[1], x[2], x[3])
    

    “数据结构”是:

    data = [yourData1, yourData2, yourData3, yourData4]
    

    然后你可以用这个来调用你的新函数:

    yourFunction(data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2020-12-26
      • 2013-01-27
      相关资源
      最近更新 更多