Home > Software engineering >  Default argument for a multiple argument function only when no argument supplied
Default argument for a multiple argument function only when no argument supplied

Time:02-10

Let's consider a function that accepts multiple arguments as under:

def my_function(*args):
    my_list = []
    for _ in args:
        my_list.append(_)
    another_function(my_list)

Now, the issue that I face in my scenario is that: I need my_list to contain at least one value, any argument, but at least one.

A user can do my_function(arg1), my_fuynction(arg1,arg2), my_function(arg1,arg2,arg3) and so on. But if a user does my_function(), I need to provide a default argument (say arg1) to the function.

If I put an default argument, then the argument defaultarg will be compulsory and it has to be supplied with some value:

def my_function(defaultarg, *args):
    #function

If I put it as optional argument, then I will have to provide a default value to the argument:

def my_function(optionalarg = defaultvalue, *args):
    #function

Both these ways do not work for me as I can't make it compulsory and I can't give a default value for it.

How do I create this function so that if no arguments are passed, the function assumes one argument to have been passed?

As of now, I am handling this by putting a if...else in the function as under:

def my_function(*args):
    my_list = []
    if len(args) == 0:
        my_list.append('defaultarg')
    else:
        for _ in args:
            my_list.append(_)
    another_function(my_list)

Is there any better way to do this?

CodePudding user response:

I can't give a default value for it

I don't understand this part of your question. You are providing the default value 'defaultarg' in your own solution?! My answer assumes that you can get the default value from somewhere.

Anyway, if you want to keep the f(*args) signature, you can check whether the args tuple is empty and supply a default value.

def my_function(*args):
     if not args:
         args = (default_value,)
     # more code

or

def my_function(*args):
     if not args:
         return my_function(default_value)
     # more code

You won't get around explicitly checking whether args is empty, but maybe you'll like one of these proposals better than your version.

edit:

You could also write a parameterized decorator.

def with_default_value(default_value):
    def with_default_value_decorator(f):
        def f_new(*args):
            if not args:
                return f(default_value)
            return f(*args)
        return f_new
    return with_default_value_decorator

Example:

@with_default_value('hi')
def my_print(*args):
    print(' '.join(args))    
    

Demo:

>>> my_print('hello', 'world')
hello world
>>> my_print()
hi
  • Related