32

For instance, I want:

def func(n=5.0,delta=n/10):

If the user has specified a delta, use it. If not, use a value that depends on n. Is this possible?

elexhobby
  • 2,588
  • 5
  • 24
  • 33
  • 1
    Python doesn't support doing this directly in the arglist, unlike (say) R. The Python solution is typically to default to `None` (`/np.nan/ np.NINF/np.PINF/`etc.) and then have the function body compute the correct default. – smci May 08 '18 at 10:29

4 Answers4

40

The language doesn't support such syntax.

The usual workaround for these situations(*) is to use a default value which is not a valid input.

def func(n=5.0, delta=None):
     if delta is None:
         delta = n/10

(*) Similar problems arise when the default value is mutable.

Karoly Horvath
  • 94,607
  • 11
  • 117
  • 176
5

You can't do it in the function definition line itself, you need to do it in the body of the function:

def func(n=5.0,delta=None):
    if delta is None:
        delta = n/10
BrenBarn
  • 242,874
  • 37
  • 412
  • 384
3

These answers will work in some cases, but if your dependent argument (delta) is a list or any iterable data type, the line

    if delta is None:

will throw the error

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

If your dependent argument is a dataframe, list, Series, etc, the following lines of code will work better. See this post for the idea / more details.

    def f(n, delta = None):
        if delta is f.__defaults__[0]:
            delta = n/10
Community
  • 1
  • 1
baileyw
  • 71
  • 3
2

You could do:

def func(n=5.0, delta=None):
    if delta is None:
        delta = n / 10
    ...
jonrsharpe
  • 115,751
  • 26
  • 228
  • 437