Can a variable number of arguments be passed to a function?
Yes. You can use *args
as a non-keyword argument. You will then be able to pass any number of arguments.
def manyArgs(*arg): print "I was called with", len(arg), "arguments:", arg>>> manyArgs(1)I was called with 1 arguments: (1,)>>> manyArgs(1, 2, 3)I was called with 3 arguments: (1, 2, 3)
As you can see, Python will unpack the arguments as a single tuple with all the arguments.
For keyword arguments you need to accept those as a separate actual argument, as shown in Skurmedel's answer.
Adding to unwinds post:
You can send multiple key-value args too.
def myfunc(**kwargs): # kwargs is a dictionary. for k,v in kwargs.iteritems(): print "%s = %s" % (k, v)myfunc(abc=123, efh=456)# abc = 123# efh = 456
And you can mix the two:
def myfunc2(*args, **kwargs): for a in args: print a for k,v in kwargs.iteritems(): print "%s = %s" % (k, v)myfunc2(1, 2, 3, banan=123)# 1# 2# 3# banan = 123
They must be both declared and called in that order, that is the function signature needs to be *args, **kwargs, and called in that order.
If I may, Skurmedel's code is for python 2; to adapt it to python 3, change iteritems
to items
and add parenthesis to print
. That could prevent beginners like me to bump into:AttributeError: 'dict' object has no attribute 'iteritems'
and search elsewhere (e.g. Error “ 'dict' object has no attribute 'iteritems' ” when trying to use NetworkX's write_shp()) why this is happening.
def myfunc(**kwargs):for k,v in kwargs.items(): print("%s = %s" % (k, v))myfunc(abc=123, efh=456)# abc = 123# efh = 456
and:
def myfunc2(*args, **kwargs): for a in args: print(a) for k,v in kwargs.items(): print("%s = %s" % (k, v))myfunc2(1, 2, 3, banan=123)# 1# 2# 3# banan = 123