如何忽略传递给Python函数的意外关键字参数

问题描述 投票:0回答:2

我的问题与此one有关,但是那里的**kwargs解决方案不适用于我。

假设我具有如下所示的一些功能。 func_a打印arg1arg2的值。 func_b打印arg1arg3的值。因此,arg1对两个功能都是通用的。我现在有一个函数func,它同时调用func_afunc_b。在func的参数中,我希望能够以arg1arg2作为可选参数传递arg3,因此为什么我默认将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'
python function parameter-passing
2个回答
3
投票

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"))

0
投票

您想通过允许它们使用kwarg来盲目地将func_a中的arg3和func_b中的arg2丢弃,但似乎忽略了它们。

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

def func_b(arg1, arg3=None, **kwargs):
   ...
© www.soinside.com 2019 - 2024. All rights reserved.