I'm looking to mimic the behavior of built-in functions (like getattr) that allow the user to specify a "default" return value. My initial attempt was to do this
def myfunc(foo, default=None):
# do stuff
if (default is not None):
return default
raise SomeException()
The problem is that if the users wants None to be their return value, this function would instead raise an exception. second attempt:
def myfunc(foo, **kwargs):
# do stuff
if ('default' in kwargs):
return kwargs['default']
raise SomeException()
This addresses the above issue and allows the user to specify any arbitrary value, but introduces an annoyance in that the user must always specify default=bar in their function calls; they can't just provide bar at the end. Likewise, *args could be used, but prevents users from using default=bar if they prefer that syntax.
Combining *args and **kwargs provides a workable solution, but it feels like this is going to a lot of effort. It also potentially masks improper function calls (eg bar = myfunc(foo, baz, default=qux))
def myfunc(foo, *args, **kwargs):
# do stuff
if (len(args) == 1):
return args[0]
if ('default' in kwargs):
return kwargs['default']
raise SomeException()
Is there a simpler solution? (python 3.2 if that matters)