| ## @file | |
| # help with caching in BaseTools | |
| # | |
| # Copyright (c) 2018, Intel Corporation. All rights reserved.<BR> | |
| # | |
| # SPDX-License-Identifier: BSD-2-Clause-Patent | |
| # | |
| ## Import Modules | |
| # | |
| # for class function | |
| class cached_class_function(object): | |
| def __init__(self, function): | |
| self._function = function | |
| def __get__(self, obj, cls): | |
| def CallMeHere(*args,**kwargs): | |
| Value = self._function(obj, *args,**kwargs) | |
| obj.__dict__[self._function.__name__] = lambda *args,**kwargs:Value | |
| return Value | |
| return CallMeHere | |
| # for class property | |
| class cached_property(object): | |
| def __init__(self, function): | |
| self._function = function | |
| def __get__(self, obj, cls): | |
| Value = obj.__dict__[self._function.__name__] = self._function(obj) | |
| return Value | |
| # for non-class function | |
| class cached_basic_function(object): | |
| def __init__(self, function): | |
| self._function = function | |
| # wrapper to call _do since <class>.__dict__ doesn't support changing __call__ | |
| def __call__(self,*args,**kwargs): | |
| return self._do(*args,**kwargs) | |
| def _do(self,*args,**kwargs): | |
| Value = self._function(*args,**kwargs) | |
| self.__dict__['_do'] = lambda self,*args,**kwargs:Value | |
| return Value |