前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >七个好用的装饰器

七个好用的装饰器

作者头像
somenzz
发布2022-10-25 20:44:17
2690
发布2022-10-25 20:44:17
举报
文章被收录于专栏:Python七号Python七号

分享七个好用的装饰器,方便你撸代码。

1、dispach

Python 天然支持多态,但使用 dispatch 可以让你的代码更加容易阅读。

安装:

代码语言:javascript
复制
pip install multipledispatch

使用:

代码语言:javascript
复制
>>> 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 可以很方便地让你实现命令行工具。

安装:

代码语言:javascript
复制
pip install click

使用:demo2.py :

代码语言:javascript
复制
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()

运行结果:

代码语言:javascript
复制
❯ 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

分布式的任务队列,非 Celery 莫属。

Celery 介绍和详细用法,可以参考前文:

开发环境下,如何通过一个命令让 fastapi 和 celery 一起工作

一文搞定 celery 任务远程调用

代码语言:javascript
复制
from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

4、deprecated

这个相信大家在使用别的包时都遇到过,当要下线一个老版本的函数的时候就可以使用这个装饰器。

安装:

代码语言:javascript
复制
pip install Deprecated

使用:demo4.py

代码语言:javascript
复制
from deprecated import deprecated
@deprecated ("This function is deprecated, please do not use it")
def func1():
    pass

func1()

运行效果如下:

代码语言:javascript
复制
❯ 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

安装:

代码语言:javascript
复制
pip install deco

使用 DECO 就像在 Python 程序中查找或创建两个函数一样简单。我们可以用 @concurrent 装饰需要并行运行的函数,用 @synchronized 装饰调用并行函数的函数,使用举例:

代码语言:javascript
复制
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

缓存工具

安装:

代码语言:javascript
复制
pip install cachetools

使用:

代码语言:javascript
复制
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

重试装饰器,支持各种各样的重试需求。

安装:

代码语言:javascript
复制
pip install tenacity

使用:

代码语言:javascript
复制
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

最后

本文分享了七个好用的装饰器,希望对你写代码有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、dispach
  • 2、click
  • 3、celery
  • 4、deprecated
  • 5、deco.concurrent
  • 6、cachetools
  • 7、retry
  • 最后
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档