How to ignore unexpected keyword argument(s) passed to functions in Python

python function unexpected keyword argument
got an unexpected keyword argument

My question is related to this one, however the **kwargs solution there isn't working for me.

Let's say I have some functions as shown below. func_a prints the values of arg1 and arg2. func_b prints the values of arg1 and arg3. So arg1 is common to both functions. I now have a function, func, that calls both func_a and func_b. In the arguments to func I want to be able to pass arg1, with arg2 and arg3 as optional arguments, hence why I set arg2 and arg3 to None by default. However, when I try to call func(arg1='how', arg2='are') I get an unexpected keyword argument error. How can I fix this?

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'

You want to drop blindly arg3 in func_a and arg2 in func_b by allowing them with kwargs but then ignoring them it seems.

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

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

How does one ignore unexpected keyword arguments passed to a , EDIT If you still want to use default arguments, you keep the original argument you pass in by the keyword arguments using the argspec function in older versions of python or the signature inspection method in Python 3.6. All positional arguments to Python functions can also be passed by keyword, where the name of the argument is used in an assignment within the parentheses of a function call. The keyword arguments can be passed in any order as long as all of the required positional arguments are specified. You can mix and match keyword and positional arguments.

kwargs is just a dict of function arguments, so you could just use get to get the relevant arguments for each function, which will return None if they aren't found:

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

Effective Python: 4 Best Practices for Function Arguments, Item 19: Provide Optional Behavior with Keyword Arguments All positional arguments to Python functions can also be passed by keyword, where the Other times, you want to ignore OverflowError exceptions and return zero instead. def Trying to pass unexpected keyword arguments also won't work. Keyword-only arguments are not required to have a default value. Since Python requires that all arguments be bound to a value, and since the only way to bind a value to a keyword-only argument is via keyword, such arguments are therefore 'required keyword' arguments.

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

Any way to ignore/avoid "got an unexpected keyword argument , Is there any way I can call a service operation with keyword arguments that aren't in it's signature? args I originally sent, and I need to recall the method with the same args, to basically tell the server "ignore this warning" **args) File "d:\ python\saas-gsked ests\libpi.py", line 161, in call_method response� Python allows functions to be called using keyword arguments. When we call functions in this way, the order (position) of the arguments can be changed. Following calls to the above function are all valid and produce the same result.

Errors when using keyword arguments in functions defined by , If I define a passed in function using the Callable syntax, mypy complains if I then "check_func": sample_python.py:9: error: Unexpected keyword argument "d" kezabelle added a commit to kezabelle/python-enviable that referenced this� Since Python 3.6, functions always preserve the order of the keyword arguments passed to them (see PEP 468). This means that when ** is used to capture keyword arguments, the resulting dictionary will have keys in the same order the arguments were passed. So since Python 3.6, you’ll never see something like this happen:

How to Use the Kwargs in Python-, In this post I will show you how to pass parameters to functions using the "< stdin>", line 1, in <module> TypeError: func() got an unexpected keyword argument 'x' Arguments that are without a variable are called positional and are stored in� Note: Python’s argument-passing mechanism has been called pass-by-assignment. This is because parameter names are bound to objects on function entry in Python, and assignment is also the process of binding a name to an object. You may also see the terms pass-by-object, pass-by-object-reference, or pass-by-sharing.

PEP 3102 -- Keyword-Only Arguments, This PEP proposes a change to the way that function arguments are that any ' left over' arguments be passed into the varargs parameter as a tuple. Unfortunately, the 'ignore' argument will also suck up any erroneous� Arguments that are read from a file (see the fromfile_prefix_chars keyword argument to the ArgumentParser constructor) are read one argument per line. convert_arg_line_to_args() can be overridden for fancier reading. This method takes a single argument arg_line which is a string read from the argument file. It returns a list of arguments parsed

Comments
  • Just add **kwargs to both func_a and func_b, maybe?
  • Why not just extract the relevant data for each in func? Broadly passing all the data everywhere seems messy.
  • Python functions are strict about there function signatures, although, you are allowed to write a signature which will pretty much accept anything, i.e. def func(*args, **kwargs). The way you've written your functions, though, they will complain if you pass the incorrect arguments, which is a good thing
  • You're not passing arg3 to func() in your example, that's why func2 can't access it.
  • "the **kwargs solution there isn't working for me." needs to be explained further. What did you try? What did not work?