keyword arguments are also very useful when we need to accept arbitrary arguments to pass to second functionbut we don' know what those arguments will be we saw this in action in when objects are alikewhen we were building support for multiple inheritance we canof coursecombine the variable argument and variable keyword argument syntax in one function calland we can use normal positional and default arguments as well the following example is somewhat contrivedbut demonstrates the four types in actionimport shutil import os path def augmented_move(target_folder*filenamesverbose=false**specific)'''move all filenames into the target_folderallowing specific treatment of certain files ''def print_verbose(messagefilename)'''print the message only if verbose is enabled''if verboseprint(message format(filename)for filename in filenamestarget_path os path join(target_folderfilenameif filename in specificif specific[filename='ignore'print_verbose("ignoring { }"filenameelif specific[filename='copy'print_verbose("copying { }"filenameshutil copyfile(filenametarget_pathelseprint_verbose("moving { }"filenameshutil move(filenametarget_paththis example will process an arbitrary list of files the first argument is target folderand the default behavior is to move all remaining non-keyword argument files into that folder then there is keyword-only argumentverbosewhich tells us whether to print information on each file processed finallywe can supply dictionary containing actions to perform on specific filenamesthe default behavior is to move the filebut if valid string action has been specified in the keyword argumentsit can be ignored or copied instead notice the ordering of the parameters in the functionfirst the positional argument is specifiedthen the *filenames listthen any specific keyword-only argumentsand finallya **specific dictionary to hold remaining keyword arguments