Packing and Unpacking Arguments in Python
Last Updated :
10 Apr, 2023
We use two operators * (for tuples) and ** (for dictionaries).
Background
Consider a situation where we have a function that receives four arguments. We want to make a call to this function and we have a list of size 4 with us that has all arguments for the function. If we simply pass a list to the function, the call doesn’t work.
Python3
def fun(a, b, c, d):
print (a, b, c, d)
my_list = [ 1 , 2 , 3 , 4 ]
fun(my_list)
|
Output :
TypeError: fun() takes exactly 4 arguments (1 given)
Unpacking
We can use * to unpack the list so that all elements of it can be passed as different parameters.
Python3
def fun(a, b, c, d):
print (a, b, c, d)
my_list = [ 1 , 2 , 3 , 4 ]
fun( * my_list)
|
Output :
(1, 2, 3, 4)
We need to keep in mind that the no. of arguments must be the same as the length of the list that we are unpacking for the arguments.
Python3
args = [ 0 , 1 , 4 , 9 ]
def func(a, b, c):
return a + b + c
func( * args)
|
Output:
Traceback (most recent call last):
File "/home/592a8d2a568a0c12061950aa99d6dec3.py", line 10, in <module>
func(*args)
TypeError: func() takes 3 positional arguments but 4 were given
As another example, consider the built-in range() function that expects separate start and stops arguments. If they are not available separately, write the function call with the *-operator to unpack the arguments out of a list or tuple:
Python3
>>>
>>> range ( 3 , 6 )
[ 3 , 4 , 5 ]
>>> args = [ 3 , 6 ]
>>> range ( * args)
[ 3 , 4 , 5 ]
|
Packing
When we don’t know how many arguments need to be passed to a python function, we can use Packing to pack all arguments in a tuple.
Python3
def mySum( * args):
return sum (args)
print (mySum( 1 , 2 , 3 , 4 , 5 ))
print (mySum( 10 , 20 ))
|
Output:
15
30
The above function mySum() does ‘packing’ to pack all the arguments that this method call receives into one single variable. Once we have this ‘packed’ variable, we can do things with it that we would with a normal tuple. args[0] and args[1] would give you the first and second argument, respectively. Since our tuples are immutable, you can convert the args tuple to a list so you can also modify, delete, and re-arrange items in i.
Packing and Unpacking
Below is an example that shows both packing and unpacking.
Python3
def fun1(a, b, c):
print (a, b, c)
def fun2( * args):
args = list (args)
args[ 0 ] = 'Geeksforgeeks'
args[ 1 ] = 'awesome'
fun1( * args)
fun2( 'Hello' , 'beautiful' , 'world!' )
|
Output:
(Geeksforgeeks, awesome, world!)
The time complexity of the given Python program is O(1), which means it does not depend on the size of the input.
The auxiliary space complexity of the program is O(n), where n is the number of arguments passed to the fun2 function.
** is used for dictionaries
Python3
def fun(a, b, c):
print (a, b, c)
d = { 'a' : 2 , 'b' : 4 , 'c' : 10 }
fun( * * d)
|
Output:
2 4 10
Here ** unpacked the dictionary used with it, and passed the items in the dictionary as keyword arguments to the function. So writing “fun(1, **d)” was equivalent to writing “fun(1, b=4, c=10)”.
Python3
def fun( * * kwargs):
print ( type (kwargs))
for key in kwargs:
print ( "%s = %s" % (key, kwargs[key]))
fun(name = "geeks" , ID = "101" , language = "Python" )
|
Output
<class 'dict'>
name = geeks
ID = 101
language = Python
Applications and Important Points
- Used in socket programming to send a vast number of requests to a server.
- Used in the Django framework to send variable arguments to view functions.
- There are wrapper functions that require us to pass in variable arguments.
- Modification of arguments becomes easy, but at the same time validation is not proper, so they must be used with care.
Reference :
http://hangar.runway7.net/python/packing-unpacking-arguments
Please Login to comment...