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)
return() in Python The return() statement, like in other programming languages ends the function call and returns the result to the caller. It is a key component in any function or method in a code which includes the return keyword and the value that is to be returned after that.
You can set the default values for variables by adding ! default flag to the end of the variable value. It will not re-assign the value, if it is already assigned to the variable.
Python uses the keyword None to define null objects and variables. While None does serve some of the same purposes as null in other languages, it's another beast entirely. As the null in Python, None is not defined to be 0 or any other value. In Python, None is an object and a first-class citizen!
You need to use a sentinel to detect that a default value was not set:
sentinel = object()
def func(someparam, default=sentinel):
if default is not sentinel:
print("You passed in something else!")
This works because an instance of object()
will always have it's own memory id and thus is
will only return True if the exact value was left in place. Any other value will not register as the same object, including None
.
You'll see different variants of the above trick in various different python projects. Any of the following sentinels would also work:
sentinel = []
sentinel = {}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With