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.
Got a question? Hit me on Twitter: avkorablev