【问题标题】:How to ignore unexpected keyword argument(s) passed to functions in Python如何忽略传递给 Python 函数的意外关键字参数
【发布时间】:2020-03-08 13:22:49
【问题描述】:

我的问题与这个one 有关,但是那里的**kwargs 解决方案对我不起作用。

假设我有一些如下所示的功能。 func_a 打印 arg1arg2 的值。 func_b 打印 arg1arg3 的值。所以arg1 对这两个函数都是通用的。我现在有一个函数func,它同时调用func_afunc_b。在func 的参数中,我希望能够传递arg1,将arg2arg3 作为可选参数,因此我将arg2arg3 默认设置为None。但是,当我尝试调用func(arg1='how', arg2='are') 时,我收到unexpected keyword argument 错误。我怎样才能解决这个问题?

def func_a(arg1, arg2=None):
    print(arg1)
    if arg2 is not None:
        print(arg2)

def func_b(arg1, arg3=None):
    print(arg1)
    if arg3 is not None:
        print(arg3)

def func(arg1, **kwargs):
    func_a(arg1, **kwargs)
    func_b(arg1, **kwargs)

# Try to call func
func(arg1='how', arg2='are')
how
are
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-372fbc7b1e90> in <module>
----> 1 func(arg1='how', arg2='are')

<ipython-input-8-5edc2a4c5bfd> in func(arg1, **kwargs)
     11 def func(arg1, **kwargs):
     12     func_a(arg1, **kwargs)
---> 13     func_b(arg1, **kwargs)

TypeError: func_b() got an unexpected keyword argument 'arg2'

【问题讨论】:

  • 只需将**kwargs 添加到func_afunc_b,也许?
  • 为什么不直接为func 中的每个提取相关数据?到处传递所有数据似乎很混乱。
  • Python 函数对函数签名非常严格,尽管您可以编写一个几乎可以接受任何内容的签名,即def func(*args, **kwargs)。但是,按照您编写函数的方式,如果您传递了不正确的参数,他们会抱怨,这是一件好事
  • 在您的示例中,您没有将 arg3 传递给 func(),这就是 func2 无法访问它的原因。
  • "那里的 **kwargs 解决方案对我不起作用。"需要进一步解释。你尝试了什么?什么不起作用?

标签: python function parameter-passing


【解决方案1】:

kwargs 只是一个函数参数的字典,所以你可以使用get 来获取每个函数的相关参数,如果找不到它们将返回None

def func_a(arg1, arg2=None):
    print(arg1)
    if arg2 is not None:
        print(arg2)

def func_b(arg1, arg3=None):
    print(arg1)
    if arg3 is not None:
        print(arg3)

def func(arg1, **kwargs):
    func_a(arg1, arg2=kwargs.get("arg2"))
    func_b(arg1, arg3=kwargs.get("arg3"))

【讨论】:

    【解决方案2】:

    您想通过允许使用 kwargs 将 func_a 中的 arg3 和 func_b 中的 arg2 盲目地删除,然后似乎忽略它们。

    def func_a(arg1, arg2=None, **kwargs):
        ...
    
    def func_b(arg1, arg3=None, **kwargs):
       ...
    

    【讨论】:

      【解决方案3】:
      def func_a(**kwargs):
          for key,value in kwargs.items():
              if key=='arg1':
                  print(value)
              if key=='arg2' and value!=None:
                  print(value)
      
      def func_b(**kwargs):
          for key,value in kwargs.items():
              if key=='arg1':
                  print(value)
              if key=='arg3' and value!=None:
                  print(value)
      
      def func(**kwargs):
          func_a(**kwargs)
          func_b(**kwargs)
      
      # Try to call func
      func(arg1='how', arg3='are')
      

      【讨论】:

        猜你喜欢
        • 2014-12-18
        • 2019-07-07
        • 2018-03-21
        • 2020-01-21
        • 2021-02-22
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多