From 09f5669d49d8723d30895954da7fbef2c13935d6 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 9 May 2025 13:09:32 +0000 Subject: [PATCH] decorators: Import some basic @lazy_property generator Signed-off-by: Michael Tremer --- Makefile.am | 1 + src/westferry/decorators.py | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/westferry/decorators.py diff --git a/Makefile.am b/Makefile.am index a9999b1..70b589f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -85,6 +85,7 @@ westferry_PYTHON = \ src/westferry/__init__.py \ src/westferry/constants.py \ src/westferry/application.py \ + src/westferry/decorators.py \ src/westferry/i18n.py \ src/westferry/logging.py \ src/westferry/services.py diff --git a/src/westferry/decorators.py b/src/westferry/decorators.py new file mode 100644 index 0000000..3648e3d --- /dev/null +++ b/src/westferry/decorators.py @@ -0,0 +1,52 @@ +#!/usr/bin/python3 +############################################################################### +# # +# Westferry - The IPFire web user interface # +# Copyright (C) 2015 IPFire development team # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### + +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