Below is examples of passing arguments to python via regular argument assignment, and tuples and *tuples, and dictionaries and **dictionaries.
Here is my gist link for it: https://gist.github.com/anonymous/271d6160cdd90a482b40 (older)
Not covering all methods (for example didnt cover default values if argument is not passed http://lgiordani.com/blog/2015/02/11/default-arguments-in-python/#.VsBpuPIrKHs although default values for none stated argument can be achieved if *arg & *kargs are in the function prototype/definition), but most of them covered in the test script below
builds upon:
* http://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
* http://stackoverflow.com/questions/9539921/python-function-with-optional-arguments
* and https://gist.github.com/c0ldlimit/4091273 (added test cases to this one)
Study the output and play around with the script to get better understanding
I ran it like this “python test.py”
Im using python 2.7.3
Test Python Script: test.py
################################################################ # This example passes one formal (positional) argument, and two more variable length arguments. def test_var_args(farg, *args): print "######### test_var_args #########" print "formal arg:", farg for arg in args: print "another arg:", arg test_var_args(1, "two", 3) ################################################################ # Here is an example of how to use the keyworded form. Again, one formal argument and two keyworded variable arguments are passed. def test_var_kwargs(farg, **kwargs): print "######### test_var_kwargs #########" print "formal arg:", farg for key in kwargs: print "another keyword arg: %s: %s" % (key, kwargs[key]) test_var_kwargs(farg=1, myarg2="two", myarg3=3) test_var_kwargs(farg=1, **{"myarg2":"twotwo", "myarg3":3}) ################################################################ # This special syntax can be used, not only in function definitions, but also when calling a function. def test_var_args_call(arg1, arg2, arg3): print "######### test_var_args_call #########" print "arg1:", arg1 print "arg2:", arg2 print "arg3:", arg3 args = ("two", 3) test_var_args_call(1, *args) # imagine this does test_var_args_call(1,"two",3) ################################################################ # Here is an example using the keyworded form when calling a function: def test_var_args_call(arg1, arg2, arg3): print "######### test_var_args_call #########" print "arg1:", arg1 print "arg2:", arg2 print "arg3:", arg3 kwargs = {"arg3": 3, "arg2": "two"} test_var_args_call(1, **kwargs) ################################################################ # Here is an example using the keyworded form when calling a function: def test_var_args_call(arg1, arg2, arg3,arg4): # note the function can be redefined without issues print "######### test_var_args_call #########" print "arg1:", arg1 print "arg2:", arg2 print "arg3:", arg3 print "arg4:", arg4 kwargs = {"arg4": 3, "arg3": "two"} test_var_args_call(1,2, **kwargs) # same as test_var_args(1,2,"two",3) test=(3,2) test_var_args_call(*test, **kwargs) # same as test_var_args(3,2,"two",3) ################################################################ # testing all 3 def test_var_args_call3(arg1, arg2, arg3,arg4,arg5): print "######### test_var_args_call #########" print "arg1:", arg1 print "arg2:", arg2 print "arg3:", arg3 print "arg4:", arg4 print "arg5:", arg5 kwargs = {"arg5": 3, "arg4": "two"} test=("Asd",3,2) test_var_args_call3(*test, **kwargs) test=(3,2) test_var_args_call3("final",*test, **kwargs) # same as test_var_call3("final",3,2,"two",3) ################################################################ # testing optional vars: a,b are needed everything else optional def test1(a,b,*arg,**kargs): print "###### test1 ########" print "a:", a print "b:", b print "arg:", arg print "karg:", kargs test1("a","b") # test1("a") # FAIL - will error out test1(5,4,("asdf","a234",234,543),(234,643),**{"car":"toyota","price":234}) test1(5,4,("asdf","a234",234,543),*(234,643),**{"car":"toyota","price":234}) # test1(5,4,*("asdf","a234",234,543),*(234,643),**{"car":"toyota","price":234}) # FAIL - will error out # test1(5,4,*("asdf","a234",234,543),*(234,643),**{"car":"toyota","price":234},**{"toy":234,"sky":'blue'}) # FAIL - will error out ################################################################ # testing optional vars: a,b are needed everything else optional def test2(a,b,*arg): print "###### test2 ########" print "a:", a print "b:", b print "arg:", arg test2("a","b") # test1("a") # FAIL - will error out # test2(5,4,("asdf","a234",234,543),(234,643),**{"car":"toyota","price":234}) # FAIL - will error out # test2(5,4,("asdf","a234",234,543),*(234,643),**{"car":"toyota","price":234}) # FAIL - will error out # test2(5,4,*("asdf","a234",234,543),*(234,643),**{"car":"toyota","price":234}) # FAIL - will error out # test2(5,4,*("asdf","a234",234,543),*(234,643),**{"car":"toyota","price":234},**{"toy":234,"sky":'blue'}) # FAIL - will error out test2(5,4,("asdf","a234",234,543),*(234,643)) test2(5,4,("asdf","a234",234,543),("zebrt","lol"),*(234,643)) test2(5,4,*("asdf","a234",234,543)) # test2(5,4,*("asdf","a234",234,543),*(234,643)) # FAIL - will error out ################################################################ # testing optional vars: a,b are needed everything else optional def test2(a,b,**kargs): print "###### test2 ########" print "a:", a print "b:", b print "kargs:", kargs test2("a","b") # test2("a") # FAIL - will error out # test2(5,4,("asdf","a234",234,543),(234,643),**{"car":"toyota","price":234}) # FAIL - will error out # test2(5,4,("asdf","a234",234,543),*(234,643),**{"car":"toyota","price":234}) # FAIL - will error out # test2(5,4,*("asdf","a234",234,543),*(234,643),**{"car":"toyota","price":234}) # FAIL - will error out test2(5,4,**{"toy":234,"sky":'blue'}) # FAIL - will error out # test2(5,4,{"toy":234,"sky":'blue'}) # FAIL - will error out # test2(5,4,**{"car":"toyota","price":234},**{"toy":234,"sky":'blue'}) # FAIL - will error out # test2(5,4,*("asdf","a234",234,543),*(234,643)) # FAIL - will error out ## INTERESTING NOTES: # only 1 *(a,b,c) can be passed as an arg # only 1 **{dictionary} can be passed as kwarg # multiple (a,b,c), can be passed as an arg # {a,b,c} are passed as a variable and fail because our first 2 none-optional args are taken
Output:
# python test.py ######### test_var_args ######### formal arg: 1 another arg: two another arg: 3 ######### test_var_kwargs ######### formal arg: 1 another keyword arg: myarg2: two another keyword arg: myarg3: 3 ######### test_var_kwargs ######### formal arg: 1 another keyword arg: myarg2: twotwo another keyword arg: myarg3: 3 ######### test_var_args_call ######### arg1: 1 arg2: two arg3: 3 ######### test_var_args_call ######### arg1: 1 arg2: two arg3: 3 ######### test_var_args_call ######### arg1: 1 arg2: 2 arg3: two arg4: 3 ######### test_var_args_call ######### arg1: 3 arg2: 2 arg3: two arg4: 3 ######### test_var_args_call ######### arg1: Asd arg2: 3 arg3: 2 arg4: two arg5: 3 ######### test_var_args_call ######### arg1: final arg2: 3 arg3: 2 arg4: two arg5: 3 ###### test1 ######## a: a b: b arg: () karg: {} ###### test1 ######## a: 5 b: 4 arg: (('asdf', 'a234', 234, 543), (234, 643)) karg: {'car': 'toyota', 'price': 234} ###### test1 ######## a: 5 b: 4 arg: (('asdf', 'a234', 234, 543), 234, 643) karg: {'car': 'toyota', 'price': 234} ###### test2 ######## a: a b: b arg: () ###### test2 ######## a: 5 b: 4 arg: (('asdf', 'a234', 234, 543), 234, 643) ###### test2 ######## a: 5 b: 4 arg: (('asdf', 'a234', 234, 543), ('zebrt', 'lol'), 234, 643) ###### test2 ######## a: 5 b: 4 arg: ('asdf', 'a234', 234, 543) ###### test2 ######## a: a b: b kargs: {} ###### test2 ######## a: 5 b: 4 kargs: {'toy': 234, 'sky': 'blue'}
The end