【问题标题】:How can I give an argument without knowing its name to a multiparameter function? Python如何在不知道参数名称的情况下将参数提供给多参数函数? Python
【发布时间】:2020-03-29 11:35:30
【问题描述】:

您好,我有一个多参数函数,其中 kwargs 中只缺少一个参数,我希望能够在不知道它是什么参数的情况下输入缺少的参数:

def function(a,b,c):    #multiparameter function
    print('a=',a)
    print('b=',b)
    print('c=',c)

kwargs={'a':1,'b':2}    #only the value for c is missing

如果我跑 function(3,**kwargs) 它解释为 a=3 但我希望它解释为 c=3

另外,我可以找出丢失变量的名称,但我无法将其正确地提供给函数。我试着做:

variable='c'

function(variable=3,**kwargs)

但它返回错误function() got an unexpected keyword argument 'variable'

【问题讨论】:

  • 您可以提供一个变量作为您的 kwargs 字典的键。例如,variable = 'c'; kwargs = {'a': 1, 'b': 2, variable: 3}。请记住,排序很重要:如果variable = 'a',则a 将获得3 的值,而不是1c 仍然未指定。
  • 我想一次运行该函数多次,类似于:
  • np.array([function(c=3,**kwargs),function(c=4,**kwargs)

标签: python function arguments keyword-argument


【解决方案1】:

首先,您应该阅读一下*args and **kwargs

您可以使用* 强制您的参数成为关键字参数,并且您的每个关键字参数都可以有一个默认的标记值来帮助您发现它。

def function(*,a = None,b = None,c = None)
    print('a=',a)
    print('b=',b)
    print('c=',c)

如果您想即时输入内容,您可以这样做:

def function(input, *,a = None,b = None,c = None)
    print('a=',a or input)
    print('b=',b or input)
    print('c=',c or input)

【讨论】:

    【解决方案2】:

    如果不能修改function的定义,可以用functools.partial包裹起来。

    from functools import partial
    
    def function(a,b,c):    #multiparameter function
        print('a=',a)
        print('b=',b)
        print('c=',c)
    
    function_caller = partial(function, 1, 2, 3)
    

    现在,function_caller 的任何 keyword 参数都将覆盖在对 partial 的调用中指定的值:

    function_caller()  # function(1,2,3)
    function_caller(a=5, b=4) # function(5, 4, 3)
    kwargs = {'a': 5, 'b': 4}
    function_caller(**kwargs)  # Same as previous call
    

    如果您的variable 包含参数的名称,您可以轻松地将其添加到kwargs,但您不能直接将其用作关键字参数。

    variable = 'c'
    kwargs = {'a': 5, 'b': 4, variable: 3}  # {'a': 5, 'b': 4, 'c': 3}
    
    但是,

    function_caller 不接受 任何 位置参数。

    【讨论】:

    • 有没有办法在没有外部库的情况下做到这一点?
    • functools 是标准库的一部分;它已经安装好了,所以使用它确实没有缺点。
    【解决方案3】:

    如果可以将参数作为变量,那么这个请求:

    kwargs={'a':1,'b':2}    #only the value for c is missing
    variable='c'
    function(variable=3,**kwargs)
    

    如果你只是将变量添加到 kwargs 字典中就可以工作:

    kwargs[variable] = 3
    function(**kwargs)
    

    【讨论】:

    • 我想要做的是多次快速运行该函数,而不必以类似的方式更改 kwargs:np.array([function(variable=3,**kwargs),function (variable=4,**kwargs),function(variable=5,**kwargs)])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多