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)
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…