【问题标题】:How to pass large number of keyword arguments automatically in python如何在python中自动传递大量关键字参数
【发布时间】:2016-11-12 11:51:31
【问题描述】:

我正在调用一个函数

foo(x,y0=y[0],y1=y[1],y2=y[2],...,y<d>=y[<d>])

其中&lt;d&gt; 是一个很大的数字,可能因呼叫而异。除 x 之外的所有参数都是关键字参数。 我自己没有写foo,所以我不能只是将y 作为列表传递。有没有一种自动的方法将列表拆分为关键字参数?

【问题讨论】:

    标签: python parameter-passing


    【解决方案1】:

    首先,构建一个名称、值对的列表,然后将其转换为字典并将其传递给函数。

    y_vals = [ 1, 2, 3, 'a', 'b', 'c' ]
    arg_dict = dict(('y%d' % i, v) for i, v in enumerate(y_vals))
    foo(x, **arg_dict)
    

    【讨论】:

    • 这可以更简洁一点作为 dict 理解:arg_dict = { 'y%d' % i: v for i, v in enumerate(y_vals)}
    • 这正是我想要的。漂亮!
    【解决方案2】:

    使用* 从列表中传递未打包的参数,您可以发送普通参数来代替关键字参数,只需确保以正确的顺序传递它们,例如:

    def foo(x, y1=None, y2=None, y3=None, y4=None, ... , yN=None):
      # func stuff
    

    您可以将列表传递给函数解压,例如:

    arguments = ["arg-y1", "arg-y2", "arg-y3", ... , "arg-yN"]
    foo (x, *arguments)
    

    由于它们是关键字参数,它们将具有一些默认值。 如果你只想传递几个特定的​​值,你可以使用Dictionary** for kw:

    kwargs = {"y1": "arg-y1", "y3": "arg-Y3" }
    foo (x, **kwargs)
    

    【讨论】:

      【解决方案3】:

      您可以使用**kwargs 让您的函数采用任意数量的关键字参数(“kwargs”表示“关键字参数”):

      >>> def print_keyword_args(**kwargs):
      ...     # kwargs is a dict of the keyword args passed to the function
      ...     for key, value in kwargs.iteritems():
      ...         print "%s = %s" % (key, value)
      
      ... 
      >>> print_keyword_args(first_name="John", last_name="Doe")
      first_name = John
      last_name = Doe
      

      您还可以在调用函数时使用**kwargs 语法,方法是构造关键字参数字典并将其传递给您的函数:

      >>> kwargs = {'first_name': 'Bobby', 'last_name': 'Smith'}
      >>> print_keyword_args(**kwargs)
      first_name = Bobby
      last_name = Smith
      

      Python Tutorial 很好地解释了它的工作原理,并附有一些很好的例子。

      对于您将列表转换为关键字参数的情况:

      # y is a list with arguments stored.
      kwargs = {}
      for arg in range(len(y)):
          kwargs['y'+str(arg)] = y[arg]
      
      foo(**kwargs)
      

      【讨论】:

        猜你喜欢
        • 2019-08-23
        • 2017-06-13
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        • 1970-01-01
        • 2020-03-08
        • 2014-03-05
        • 1970-01-01
        相关资源
        最近更新 更多