Java-like Optional in Python

Posted on Wed, 23 Nov 2016 in Python

Sometimes using None makes a mess of a code. For example, if you want to separate some "empty" value and "no data" value for integer input where 0 isn't "empty" value, it's very hard to do with None only. Possible solution is to use something like Optional in Java.

Of course, using Optional isn't the pythonic way. In some cases using exception as supposed in this StackOverflow discussion is enough.

It doesn't work in my case. I decided to implement Optional. At the end I've got clean and nice piece of code. After short discussion with my colleagues, we decided to use Haskell names for it (Maybe instead Optional). There is my simple version:

from abc import ABCMeta, abstractmethod

class Maybe(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def get(self, default=None):
        pass


class Just(Maybe):
    def __init__(self, value):
        self.value = value

    def __nonzero__(self):
        return True

    def get(self, default=None):
        return self.value


class Nothing(Maybe):
    def __nonzero__(self):
        return False

    def get(self, default=None):
        return default

After integrating it to existing code, I can say that this solution works perfectly. Maybe you should add repr-functions. But even without them it's very convenient while debug.

If you want something more complex, try hask. Note! There is too much Haskell in their Python.

Some more approaches to deal with the same problem you can find in Python Option Types article.