【问题标题】:Compact way to pass same value to arguments将相同值传递给参数的紧凑方法
【发布时间】:2020-02-07 13:23:16
【问题描述】:

当我有一个带有一堆可选参数的函数时

def function_name(arg1=0, arg2=0, arg3=0, arg4=0, ...):
      .....doing anything

我想将相同的值传递给其中一些

function_name(arg1=1, arg3=1, arg6=1)

有没有更紧凑的方法呢? 所以我不必一直复制 =value 并填满这一行。

经过几次有用的回复后,我想我找到了我正在寻找的答案:

def myargs(value, *args):
    kargs = {}
    for arg in args:
        kargs[arg] = value
    return kargs


function_name(**myargs(1, 'arg1', 'arg3', 'arg6'))

谢谢大家,如果我无法解释我需要什么,请见谅。

【问题讨论】:

  • 有多少个可选参数?它们总是具有相同的价值吗?传递 3 个参数似乎不是问题,您可以交替进行 dict kwargs 映射
  • 我猜 30 左右。不是我的职责。我需要通过不到 10 分。这不是一个真正的问题,只是想知道是否有更好的方法来做到这一点。

标签: python arguments parameter-passing


【解决方案1】:

我认为您想要做的是关键字参数解包。您可以将字典传递给函数,它将解压缩您包含的参数。未包含的任何内容都使用默认值。

def test(w=0, x=0, y=0, z=0):
    return w+x+y+z

kwargs_1 = {'y': 1}
kwargs_2 = {'x': 2, 'z': 3}

test(**kwargs_1)
# returns:
1
test(**kwargs_2)
# returns:
5

【讨论】:

    【解决方案2】:

    您可以使用默认参数:

    def func(arg1, arg2, def_arg1="1", def_arg2="2"):
        pass
    

    【讨论】:

      【解决方案3】:

      你可以只使用 **kwargs

      def function_name(arg, argOpt1=0, argOpt2=0, **kwargs):
          pass
      
      kwargs = {"argOpt1" : 123, "argOpt2" : 234} 
      function_name('argument1', kwargs)
      
      

      thisthis

      【讨论】:

        【解决方案4】:

        如果要具有相同值的参数是连续的,则:

        def function_name(arg1=0,arg2=0,arg3=0,arg4=0):
            print(arg1, arg2, arg3, arg4)
        
        function_name(2, *[1] * 3)
        

        打印:

        2 1 1 1
        

        【讨论】:

        • 如果我想按顺序通过所有这些或前几个,那将起作用。在我的情况下,我可能需要乱序传递 arg2 和 arg4 等等,而不是全部传递。
        【解决方案5】:

        如果您没有编写该函数,并且无法更改其签名,则可以通过这种方式传递正确数量的参数:

        function_name(*(0,) * function_name.__code__.co_argcount)
        

        它将相同的值(在这种情况下为0)传递给所有函数期望的参数。

        例如,如果你只需要传递 10 个参数,你可以这样写:

        function_name(*(0,) * 10)
        

        如果你想通过它们的位置而不是它们的名字来定位特定的参数,你可以使用这个:

        import inspect
        
        
        def func(a, b, c=None, d='foo', e=False):
            print(a, b, c, d, e)
        
        
        def fill_args(fun, value, arg_numbers):
            return {
                name: value
                for name in (
                    tuple(inspect.signature(fun).parameters)[i]
                    for i in arg_numbers
                )
            }
        
        
        if __name__ == '__main__':
            func(**fill_args(func, 0, (0, 1, 2)))
            func(**fill_args(func, 'bar', (0, 1, 4)))
            func(**fill_args(func, True, (0, 1, 3)))
        

        【讨论】:

        • 所有参数都是可选的。我需要将值传递给特定的值。据我了解,您的解决方案只会将值传递给前 10 个参数。虽然我可能需要将相同的值传递给 5th 7th 11th 等参数,但将 rest 作为默认值。
        猜你喜欢
        • 1970-01-01
        • 2019-05-26
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-09
        相关资源
        最近更新 更多