From de9dc7164f7c0b0548d4e91bfce3b42f0a9fc9c5 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 10 Oct 2018 12:14:57 +0100 Subject: [PATCH] Add decorators Signed-off-by: Michael Tremer --- Makefile.am | 1 + src/backend/decorators.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/backend/decorators.py diff --git a/Makefile.am b/Makefile.am index 7b043ab6..678cdff2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -53,6 +53,7 @@ backend_PYTHON = \ src/backend/blog.py \ src/backend/countries.py \ src/backend/database.py \ + src/backend/decorators.py \ src/backend/fireinfo.py \ src/backend/geoip.py \ src/backend/iuse.py \ diff --git a/src/backend/decorators.py b/src/backend/decorators.py new file mode 100644 index 00000000..f271daf2 --- /dev/null +++ b/src/backend/decorators.py @@ -0,0 +1,33 @@ +#!/usr/bin/python3 + +class Missing(object): + pass + +_missing = Missing() + +class lazy_property(property): + """ + The property is only computed once and then being + cached until the end of the lifetime of the object. + """ + def __init__(self, fget, fset=None, fdel=None, doc=None, name=None): + property.__init__(self, fget=fget, fset=fset, fdel=fdel, doc=doc) + + self.__name__ = name or fget.__name__ + self.__module__ = fget.__module__ + + def __get__(self, obj, type=None): + if object is None: + return self + + value = obj.__dict__.get(self.__name__, _missing) + if value is _missing: + obj.__dict__[self.__name__] = value = self.fget(obj) + + return value + + def __set__(self, obj, value): + if self.fset: + self.fset(obj, value) + + obj.__dict__[self.__name__] = value -- 2.47.3