## @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 |