七個(gè)好用的裝飾器
來(lái)源:
奇酷教育 發(fā)表于:
七個(gè)好用的裝飾器
七個(gè)好用的裝飾器:
1、dispach
Python 天然支持多態(tài),但使用 dispatch 可以讓你的代碼更加容易閱讀。
安裝:
pip install multipledispatch
使用:
>>> from multipledispatch import dispatch
>>> @dispatch(int, int)
... def add(x, y):
... return x + y
>>> @dispatch(object, object)
... def add(x, y):
... return "%s + %s" % (x, y)
>>> add(1, 2)
3
>>> add(1, 'hello')
'1 + hello'
2、click
click 可以很方便地讓你實(shí)現(xiàn)命令行工具。
安裝:
pip install click
使用:demo2.py :
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
help='The person to greet.')
def hello(count, name):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo(f"Hello {name}!")
if __name__ == '__main__':
hello()
運(yùn)行結(jié)果:
? python demo2.py --count=3 --name=joih
Hello joih!
Hello joih!
Hello joih!
? python demo2.py --count=3
Your name: somenzz
Hello somenzz!
Hello somenzz!
Hello somenzz!
3、celery
分布式的任務(wù)隊(duì)列,非 Celery 莫屬。
Celery 介紹和詳細(xì)用法,可以參考前文:
開(kāi)發(fā)環(huán)境下,如何通過(guò)一個(gè)命令讓 fastapi 和 celery 一起工作
一文搞定 celery 任務(wù)遠(yuǎn)程調(diào)用
from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
4、deprecated
這個(gè)相信大家在使用別的包時(shí)都遇到過(guò),當(dāng)要下線一個(gè)老版本的函數(shù)的時(shí)候就可以使用這個(gè)裝飾器。
安裝:
pip install Deprecated
使用:demo4.py
from deprecated import deprecated
@deprecated ("This function is deprecated, please do not use it")
def func1():
pass
func1()
運(yùn)行效果如下:
? python demo4.py
demo4.py:6: DeprecationWarning: Call to deprecated function (or staticmethod) func1. (This function is deprecated, please do not use it)
func1()
5、deco.concurrent
安裝:
pip install deco
使用 DECO 就像在 Python 程序中查找或創(chuàng)建兩個(gè)函數(shù)一樣簡(jiǎn)單。我們可以用 @concurrent 裝飾需要并行運(yùn)行的函數(shù),用 @synchronized 裝飾調(diào)用并行函數(shù)的函數(shù),使用舉例:
from deco import concurrent, synchronized
@concurrent # We add this for the concurrent function
def process_url(url, data):
#Does some work which takes a while
return result
@synchronized # And we add this for the function which calls the concurrent function
def process_data_set(data):
results = {}
for url in urls:
results[url] = process_url(url, data)
return results
6、cachetools
緩存工具
安裝:
pip install cachetools
使用:
from cachetools import cached, LRUCache, TTLCache
# speed up calculating Fibonacci numbers with dynamic programming
@cached(cache={})
def fib(n):
return n if n < 2 else fib(n - 1) + fib(n - 2)
# cache least recently used Python Enhancement Proposals
@cached(cache=LRUCache(maxsize=32))
def get_pep(num):
url = 'http://www.python.org/dev/peps/pep-%04d/' % num
with urllib.request.urlopen(url) as s:
return s.read()
# cache weather data for no longer than ten minutes
@cached(cache=TTLCache(maxsize=1024, ttl=600))
def get_weather(place):
return owm.weather_at_place(place).get_weather()
7、retry
重試裝飾器,支持各種各樣的重試需求。
安裝:
pip install tenacity
使用:
import random
from tenacity import retry
@retry
def do_something_unreliable():
if random.randint(0, 10) > 1:
raise IOError("Broken sauce, everything is hosed!!!111one")
else:
return "Awesome sauce!"
@retry(stop=stop_after_attempt(7))
def stop_after_7_attempts():
print("Stopping after 7 attempts")
raise Exception
@retry(stop=stop_after_delay(10))
def stop_after_10_s():
print("Stopping after 10 seconds")
raise Exception
@retry(stop=(stop_after_delay(10) | stop_after_attempt(5)))
def stop_after_10_s_or_5_retries():
print("Stopping after 10 seconds or 5 retries")
raise Exception