Setting the default value of a function input to equal another input in Python

18,840

Solution 1

def example(a, b, c=None):
    if c is None:
        c = a
    ...

The default value for the keyword argument can't be a variable (if it is, it's converted to a fixed value when the function is defined.) Commonly used to pass arguments to a main function:

def main(argv=None):
    if argv is None:
        argv = sys.argv

If None could be a valid value, the solution is to either use *args/**kwargs magic as in carl's answer, or use a sentinel object. Libraries that do this include attrs and Marshmallow, and in my opinion it's much cleaner and likely faster.

missing = object()

def example(a, b, c=missing):
    if c is missing:
        c = a
    ...

The only way for c is missing to be true is for c to be exactly that dummy object you created there.

Solution 2

This general pattern is probably the best and most readable:

def exampleFunction(a, b, c = None):
    if c is None:
        c = a
    ...

You have to be careful that None is not a valid state for c.

If you want to support 'None' values, you can do something like this:

def example(a, b, *args, **kwargs):
    if 'c' in kwargs:
        c = kwargs['c']
    elif len(args) > 0:
        c = args[0]
    else:
        c = a

Solution 3

One approach is something like:

def foo(a, b, c=None):
    c = a if c is None else c
    # do something
Share:
18,840
Curious2learn
Author by

Curious2learn

Updated on June 04, 2022

Comments

  • Curious2learn
    Curious2learn about 2 years

    Consider the following function, which does not work in Python, but I will use to explain what I need to do.

    def exampleFunction(a, b, c = a):
        ...function body...
    

    That is I want to assign to variable c the same value that variable a would take, unless an alternative value is specified. The above code does not work in python. Is there a way to do this?

  • Admin
    Admin almost 14 years
    Exactly. Default arguments are set in stone once the function is defined.
  • aaronasterling
    aaronasterling almost 14 years
    +1 for being mentioning that None can't be a valid state for c for the c=None trick to work.
  • SIslam
    SIslam over 7 years
    @delnan Is this the reason why can not supply the non-default set argument at the last like def(x=2,y) rather I have to define function as def(y, x=2)?