In Python, can I specify a function argument's default in terms of other arguments?
Solution 1
As @Ignacio says, you can't do this. In your latter example, you might have a situation where None
is a valid value for arg2
. If this is the case, you can use a sentinel value:
sentinel = object()
def myfunc(arg1, arg2=sentinel):
if arg2 is sentinel:
arg2 = arg1
print (arg1, arg2)
myfunc("foo") # Prints 'foo foo'
myfunc("foo", None) # Prints 'foo None'
Solution 2
Not really. The other argument names don't exist until the function is actually entered.
Solution 3
The second way is fine in my opinion: it is exactly clear what you do, and for all those who will come after you and read the code. While there is a slight overhead in documenting the default behavior, the use of 'None' or any other to make your function generate a default value is very common. Putting logic inside the function calls would certainly not be commendable in my opinion, it could become very complex very soon. So just leave it in the function body, where all the code is.
Ryan C. Thompson
Updated on June 02, 2022Comments
-
Ryan C. Thompson almost 2 years
Suppose I have a python function that takes two arguments, but I want the second arg to be optional, with the default being whatever was passed as the first argument. So, I want to do something like this:
def myfunc(arg1, arg2=arg1): print (arg1, arg2)
Except that doesn't work. The only workaround I can think of is this:
def myfunc(arg1, arg2=None): if arg2 is None: arg2 = arg1 print (arg1, arg2)
Is there a better way to do this?
-
Michael Dunn over 13 yearsBut you can tidy it up slightly by changing the
if
clause in the workaround to:arg2 = arg2 or arg1
-
moinudin over 13 years@Michael That will fail if
arg2
is0
,False
or an empty sequence. -
user234461 about 6 yearsprobably better to just default arg2 to None and check that instead of bothering with a custom sentinel object unless you need to handle user provided None different from default