"""Deprecation utilities."""importwarningsfromvine.utilsimportwrapsfromcelery.exceptionsimportCDeprecationWarning,CPendingDeprecationWarning__all__=('Callable','Property','warn')PENDING_DEPRECATION_FMT="""{description} is scheduled for deprecation in \ version {deprecation} and removal in version v{removal}. \{alternative}"""DEPRECATION_FMT="""{description} is deprecated and scheduled for removal in version {removal}. {alternative}"""
[文档]defwarn(description=None,deprecation=None,removal=None,alternative=None,stacklevel=2):"""Warn of (pending) deprecation."""ctx={'description':description,'deprecation':deprecation,'removal':removal,'alternative':alternative}ifdeprecationisnotNone:w=CPendingDeprecationWarning(PENDING_DEPRECATION_FMT.format(**ctx))else:w=CDeprecationWarning(DEPRECATION_FMT.format(**ctx))warnings.warn(w,stacklevel=stacklevel)
[文档]defCallable(deprecation=None,removal=None,alternative=None,description=None):"""Decorator for deprecated functions. A deprecation warning will be emitted when the function is called. Arguments: deprecation (str): Version that marks first deprecation, if this argument isn't set a ``PendingDeprecationWarning`` will be emitted instead. removal (str): Future version when this feature will be removed. alternative (str): Instructions for an alternative solution (if any). description (str): Description of what's being deprecated. """def_inner(fun):@wraps(fun)def__inner(*args,**kwargs):from.importsimportqualnamewarn(description=descriptionorqualname(fun),deprecation=deprecation,removal=removal,alternative=alternative,stacklevel=3)returnfun(*args,**kwargs)return__innerreturn_inner
[文档]defProperty(deprecation=None,removal=None,alternative=None,description=None):"""Decorator for deprecated properties."""def_inner(fun):return_deprecated_property(fun,deprecation=deprecation,removal=removal,alternative=alternative,description=descriptionorfun.__name__)return_inner
class_deprecated_property:def__init__(self,fget=None,fset=None,fdel=None,doc=None,**depreinfo):self.__get=fgetself.__set=fsetself.__del=fdelself.__name__,self.__module__,self.__doc__=(fget.__name__,fget.__module__,fget.__doc__,)self.depreinfo=depreinfoself.depreinfo.setdefault('stacklevel',3)def__get__(self,obj,type=None):ifobjisNone:returnselfwarn(**self.depreinfo)returnself.__get(obj)def__set__(self,obj,value):ifobjisNone:returnselfifself.__setisNone:raiseAttributeError('cannot set attribute')warn(**self.depreinfo)self.__set(obj,value)def__delete__(self,obj):ifobjisNone:returnselfifself.__delisNone:raiseAttributeError('cannot delete attribute')warn(**self.depreinfo)self.__del(obj)defsetter(self,fset):returnself.__class__(self.__get,fset,self.__del,**self.depreinfo)defdeleter(self,fdel):returnself.__class__(self.__get,self.__set,fdel,**self.depreinfo)