Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python - returning a default value

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)

like image 231
Steve Avatar asked Sep 04 '12 14:09

Steve


People also ask

What does return [] mean in Python?

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.

How can we set default value to the variable?

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.

How do you return a NULL in Python?

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!


1 Answers

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 = {}
like image 122
Martijn Pieters Avatar answered Oct 26 '22 15:10

Martijn Pieters