"""Decorators for deprecated functions and parametersMichel BierlaireMon Jun 17 20:50:19 2024"""importfunctoolsimportinspectimportloggingimportosfromtypingimportAny,Callablefrombiogeme.exceptionsimportBiogemeErrorlogger=logging.getLogger(__name__)RAISE_EXCEPTION=Falseifos.environ.get('TOX_ENV_NAME')isnotNoneandRAISE_EXCEPTION:raiseException("Exception raised during testing with tox. Remove the exception raised by the deprecated functions")
[docs]defdeprecated(new_func:Callable[...,Any],)->Callable[[Callable[...,Any]],Callable[...,Any]]:"""Decorator for deprecated functions. It calls the new version of the function :param new_func: :return: """defdecorator(old_func:Callable[...,Any])->Callable[...,Any]:@functools.wraps(old_func)defwrapper(*args,**kwargs)->Any:msg=f"{old_func.__name__} is deprecated; use {new_func.__name__} instead."ifRAISE_EXCEPTION:raiseBiogemeError('Deprecated')logger.warning(msg)returnnew_func(*args,**kwargs)# Directly call the new functionwrapper.__deprecated__=Truewrapper.__newname__=new_func.__name__returnwrapperreturndecorator
[docs]defdeprecated_parameters(obsolete_params:dict[str,str|None]):defdecorator(func):func_signature=inspect.signature(func)@functools.wraps(func)defwrapper(*args,**kwargs):processed_kwargs={}forname,valueinlist(kwargs.items()):ifnameinobsolete_params:new_name=obsolete_params[name]ifnew_name:msg=f"Parameter '{name}' is deprecated; use '{new_name}={value}' instead."logger.warning(msg)processed_kwargs[new_name]=valueelse:msg=(f"Parameter '{name}' is deprecated and is ignored. "f"It will be removed in a future version.",)logger.warning(msg)else:processed_kwargs[name]=valuereturnfunc(*args,**processed_kwargs)returnwrapperreturndecorator