Eivind
Eivind

Reputation: 75

Python variable value for default argument

In Python, what value can a variable take, so that when a function is invoked with the variable as an argument, the function uses its default value for the parameter instead?

Consider the following code:

def foo(a=100):
    print(a)

b = None #blank value
foo(b)

Desired output:
100

Actual output:
None

I hypothesized that None would work, but clearly it doesn't. What value can I choose for b, so that foo(b) is equivalent to foo()? Or is this simply not possible? I'm in a situation where the value for b can either be defined, or I would like to use the default value of the parameter.

Upvotes: 1

Views: 1236

Answers (4)

Eivind
Eivind

Reputation: 75

In my case, I ended up using the inspect module to create a helper function which extracts the default values of the function as described here:

import inspect

def get_defaults(func):
    signature = inspect.signature(func)
    return { k: v.default for k, v
             in signature.parameters.items()
             if v.default is not inspect.Parameter.empty }


def foo(a=100):
    print(a)

b = get_defaults(foo)['a']
foo(b)

Output: 100

Upvotes: 0

The Dewan
The Dewan

Reputation: 51

Function default parameter uses when there don't pass any parameter for the argument. And None is not a blank value. None is an object of NoneType Datatype in python similar to Other Datatype Object.

Instead, you can use

def foo(a=100):
    a=100 if a is None else a //Ternary operator 
    print(a)

b = None #blank value
foo(b)

Output: 100

Upvotes: 1

chepner
chepner

Reputation: 532418

(This answer assumes that you cannot modify foo, and that you cannot use reflection or introspection to determine what the default argument value is.)


It's the absence of an argument, not any particular value used as an argument, that triggers the use of the default value. The only way you can produce nothing out of something is to unpack an empty mapping

foo(**{})

or an empty sequence

foo(*())

Both * and ** are part of the function-call syntax, though, not part of the argument value, so with a variable, it still looks like

b = {}
foo(**b)

b = ()
foo(*b)

Upvotes: 4

Peter
Peter

Reputation: 3495

If you want None to revert to a default value, the easiest way is to do the logic in the function itself.

def foo(a=None):
    if a is None:
        a = 100
    print(a)

Upvotes: 2

Related Questions