Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define default argument value based on previous arguments?

I want to define a resize(h, w) method, and I want to be able to call it in one of two ways:

  1. resize(x,y)
  2. resize(x)

Where, in the second call, I want y to be equal to x. Can I do this in the method definition or should I do something like resize(x,y=None) and check inside:

if y is None:
    y = x
like image 983
CIsForCookies Avatar asked May 17 '17 12:05

CIsForCookies


2 Answers

Can I do this in the method definition

No. During the method definition there's no way to know what value x might have at run-time. Default arguments are evaluated once at definition time, there's no way to save a dynamic value for y.

or should I do something like resize(x,y=None) and check inside

exactly. This is a common idiom in Python.

like image 80
Dimitris Fasarakis Hilliard Avatar answered Oct 18 '22 10:10

Dimitris Fasarakis Hilliard


To complete Jim's answer, in the case that None is valid as a parameter value, you could use variable length arguments feature (positional, and/or keyword). Example of use for positional:

def resize(x,*args):
    if args:
        if len(args)>1:
           raise Exception("Too many arguments")
        y = args[0]
    else:
        y = x

in that example, you have to pass x, but you can pass 0 or more extra positional arguments. Of course you have to do the checking manually, and you lose the y keyword.

like image 21
Jean-François Fabre Avatar answered Oct 18 '22 10:10

Jean-François Fabre