当前位置: 首页 > 科技观察

七个有用的装饰器_0

时间:2023-03-12 13:10:09 科技观察

1。dispatchPython天然支持多态性,但是使用dispatch可以让你的代码更易于阅读。安装:pipinstallmultipledispatch使用:>>>frommultipledispatchimportdispatch>>>@dispatch(int,int)...defadd(x,y):...returnx+y>>>@dispatch(object,object)...defadd(x,y):...return"%s+%s"%(x,y)>>>add(1,2)3>>>add(1,'hello')'1+hello'2,clickclick可以轻松让你实现命令行工具。安装:pipinstallclick使用:demo2.py:importclick@click.command()@click.option('--count',default=1,help='Numberofgreetings.')@click.option('--name',prompt='你的名字',help='要问候的人。')defhello(count,name):"""一个简单的程序,总共问候NAMECOUNT次。"""forxinrange(count):click.echo(f"Hello{name}!")if__name__=='__main__':hello()运行结果:?pythondemo2.py--count=3--name=joihHellojoih!Hellojoih!你好joih!?pythondemo2.py--count=3你的名字:somenzz你好somenzz!你好somenzz!你好somenzz!3、Celery的分布式任务队列非Celery莫属。fromceleryimportCeleryapp=Celery('tasks',broker='pyamqp://guest@localhost//')@app.taskdefadd(x,y):returnx+y4,deprecated相信大家都在用其他包我一直遇到,老版本功能要下线的时候可以用这个装饰器。安装:pipinstallDeprecated使用:demo4.pyfromdeprecatedimportdeprecated@deprecated("Thisfunctionisdeprecated,pleasedonotuseit")deffunc1():passfunc1()运行效果如下:?pythondemo4.pydemo4.py:6:弃用警告:调用已弃用的函数(或静态方法)func1。(此函数已弃用,请勿使用)func1()5.deco.concurrent安装:pipinstalldeco使用DECO就像查找或创建两个函数一样简单。我们可以使用@concurrent修饰需要并行运行的函数,使用@synchronized修饰调用并行函数的函数。例如:fromdecoimportconcurrent,synchronized@concurrent#我们为并发函数添加这个defprocess_url(url,data):#Doessomeworkwhichtakesawhilereturnresult@synchronized#我们为调用concurrentfunctiondefprocess_data_set(data):results={}forurlinurls:results[url]=process_url(url,data)returnresults6,cachetools缓存工具安装:pipinstallcachetools用法:fromcachetoolsimportcached,LRUCache,TTLCache#使用动态编程加速计算斐波那契数@cached(cache={})deffib(n):returnnifn<2elsefib(n-1)+fib(n-2)#cacheleastrecentlyusedPythonEnhancementProposals@cached(cache=LRUCache(maxsize=32))defget_pep(num):url='http://www.python.org/dev/peps/pep-%04d/'%numwithurllib.request.urlopen(url)ass:returns.read()#缓存天气数据不超过十分钟@cached(cache=TTLCache(maxsize=1024,ttl=600))defget_weather(place):returnowm.weather_at_place(place).get_weather()7、重试重试装饰器,支持各种类型的重试需要安装:pipinstalltenacity使用:importrandomfromtenacityimportretry@retrydefdo_something_unreliable():ifrandom.randint(0,10)>1:raiseIOError("Brokensauce,everythingishosed!!!111one")else:return"Awesomesauce!"@retry(stop=stop_after_attempt(7))defstop_after_7_attempts():print("7次尝试后停止")raiseException@retry(stop=stop_after_delay(10))defstop_after_10_s():print("10秒后停止")raiseException@retry(stop=(stop_after_delay(10)|stop_after_attempt(5)))defstop_after_10_s_or_5_retries():print("在10秒或5次重试后停止")raiseException