pass **kwargs argument to another function with **kwargs

后端 未结 5 1860
青春惊慌失措
青春惊慌失措 2020-11-30 19:06

I do not understand the following example, lets say I have these functions:

# python likes
def save(filename, data, **kwargs):
    fo = openX(filename, \"w\"         


        
相关标签:
5条回答
  • 2020-11-30 19:18

    Expanding on @gecco 's answer, the following is an example that'll show you the difference:

    def foo(**kwargs):
        for entry in kwargs.items():
            print("Key: {}, value: {}".format(entry[0], entry[1]))
    
    # call using normal keys:
    foo(a=1, b=2, c=3)
    # call using an unpacked dictionary:
    foo(**{"a": 1, "b":2, "c":3})
    
    # call using a dictionary fails because the function will think you are
    # giving it a positional argument
    foo({"a": 1, "b": 2, "c": 3})
    # this yields the same error as any other positional argument
    foo(3)
    foo("string")
    
    

    Here you can see how unpacking a dictionary works, and why sending an actual dictionary fails

    0 讨论(0)
  • 2020-11-30 19:23

    In the second example you provide 3 arguments: filename, mode and a dictionary (kwargs). But Python expects: 2 formal arguments plus keyword arguments.

    By prefixing the dictionary by '**' you unpack the dictionary kwargs to keywords arguments.

    A dictionary (type dict) is a single variable containing key-value pairs.

    "Keyword arguments" are key-value method-parameters.

    Any dictionary can by unpacked to keyword arguments by prefixing it with ** during function call.

    0 讨论(0)
  • 2020-11-30 19:23

    For #2 args will be only a formal parameter with dict value, but not a keyword type parameter.

    If you want to pass a keyword type parameter into a keyword argument You need to specific ** before your dictionary, which means **args

    check this out for more detail on using **kw

    http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/

    0 讨论(0)
  • 2020-11-30 19:23

    Because a dictionary is a single value. You need to use keyword expansion if you want to pass it as a group of keyword arguments.

    0 讨论(0)
  • 2020-11-30 19:35

    The ** syntax tells Python to collect keyword arguments into a dictionary. The save2 is passing it down as a non-keyword argument (a dictionary object). The openX is not seeing any keyword arguments so the **args doesn't get used. It's instead getting a third non-keyword argument (the dictionary). To fix that change the definition of the openX function.

    def openX(filename, mode, kwargs):
        pass
    
    0 讨论(0)
提交回复
热议问题