#!/usr/bin/env python # -*- coding: utf-8 -*- NOVALUE = object() class Maybe(object): _has_value = False _value = None def __init__(self, value): if value is not NOVALUE: self._has_value = True self._value = value def __nonzero__(self): return self.has_value @property def has_value(self): return self._has_value @property def value(self): return self._value # optional sugar factories def Some(value): return Maybe(value) def NoValue(): return Maybe(NOVALUE) if __name__ == "__main__": class MaybeSupportingRepository(object): def __init__(self, *args): self._d = dict(args) def get(self, key): return Maybe(self._d.get(key, NOVALUE)) repo = MaybeSupportingRepository( ("a", 1), ("b", 2), ("c", 3) ) key = "x" maybe_v = repo.get(key) if maybe_v: print "There's a value for %s: %s" % (key, maybe_v.value) else: print "There's no value for %s" % key key = "a" maybe_v = repo.get(key) if maybe_v.has_value: print "There's a value for %s: %s" % (key, maybe_v.value) else: print "There's no value for %s" % key