成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python,十個高效有用的裝飾器

開發
在實際應用中,我們只需在目標函數或類之前添加 @ 符號,即可快速便捷地應用裝飾器。接下來,開發常用的10種裝飾器示例代碼:

在 Python 編程領域,裝飾器是一種極具威力的工具,它如同為函數或類披上了一層神奇的 外衣,能夠在不修改原始代碼的前提下,巧妙地更改或強化其行為表現。

本質上,裝飾器是一個函數,它以其他函數或類作為輸入參數,經處理后返回一個新的函數或類。

在實際應用中,我們只需在目標函數或類之前添加 @ 符號,即可快速便捷地應用裝飾器。

接下來,開發常用的10種裝飾器示例代碼:

1. @timer

用于統計函數執行時間,對性能分析極為有利,可迅速定位代碼中的性能瓶頸。

import time

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} 耗時: {end - start:.4f}s")
        return result
    return wrapper

2. @debug

在調試過程中,該裝飾器可打印函數的參數及返回值,便于我們迅速找到問題根源。

def debug(func):
    def wrapper(*args, **kwargs):
        print(f"[DEBUG] {func.__name__} args: {args}, kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"[DEBUG] {func.__name__} returned: {result}")
        return result
    return wrapper

3. @retry

當網絡請求等操作失敗時,此裝飾器能自動進行重試,有效增強程序的魯棒性。

def retry(max_attempts=3, delay=1):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for attempt in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"Attempt {attempt + 1} failed: {e}")
                    time.sleep(delay)
            raise Exception("Max retries exceeded")
        return wrapper
    return decorator

4. @deprecated

用于標記已過時的函數,提醒用戶及時替換為新函數。

import warnings

def deprecated(func):
    def wrapper(*args, **kwargs):
        warnings.warn(f"{func.__name__} is deprecated", DeprecationWarning)
        return func(*args, **kwargs)
        return wrapper
    return wrapper

5. @permission

Web API 中,用于檢查用戶是否具備相應的權限,如是否為 admin 角色。

def permission(perm):
   def decorator(func):
       def wrapper(user, *args, **kwargs):
           if user.permission != perm:
               raise PermissionError("Access denied")
           return func(user, *args, **kwargs)
       return wrapper
   return decorator

6. @validate

確保輸入數據符合預期的格式,如數據類型、范圍等,若不符合則拋出異常。

def validate(*validators):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i, val in enumerate(args):
                if not validators[i](val):
                    raise ValueError(f"Invalid argument: {val}")
                return func(*args, **kwargs)
            return wrapper
        return decorator
    return decorator

7. @login

確保用戶已認證登錄,防止未經授權的操作。

def login(func):
    def wrapper(user, *args, **kwargs):
        if not user.is_authenticated:
            raise Exception("User not logged in")
        return func(user, *args, **kwargs)
    return wrapper

8. @log_results

將函數輸出持久化保存,方便后續查看函數運行結果。

def log_results(filename):
    def decorator(func):
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            with open(filename, "a") as f:
                f.write(f"{func.__name__}: {result}\n")
            return result
        return wrapper
    return decorator

9. @rate_limit

限制 API 調用頻率,防范 DDoS 攻擊或 API 被濫用。

from redis import Redis

redis = Redis()

def rate_limit(key, limit=100, period=3600):
    def decorator(func):
        def wrapper(*args, **kwargs):
            count = redis.get(key) or0
            if int(count) >= limit:
                raise Exception("API rate limit exceeded")
            redis.incr(key, 1)
            redis.expire(key, period)
            return func(*args, **kwargs)
        return wrapper
    return decorator

10. @singleton

確保一個類只有一個實例,在特定場景下非常有用。

def singleton(cls):
    instances = {}
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return wrapper

熟練掌握裝飾器的運用,能夠極大簡化開發流程,使代碼更加健壯可靠。在大型項目開發中,借助裝飾器實現關注點分離,如將日志記錄、權限管理等功能與核心業務邏輯分開處理,可顯著提升開發效率。

責任編輯:趙寧寧 來源: 程序員老朱
相關推薦

2023-08-02 16:14:04

2024-02-01 12:53:00

PandasPython數據

2023-10-29 17:12:26

Python編程

2023-01-17 16:43:19

JupyterLab技巧工具

2012-11-08 09:37:45

代碼編程語言

2024-05-20 08:30:00

Python編程

2012-01-17 13:54:02

PHP

2024-09-03 09:44:03

2021-01-27 11:24:00

項目經理技術技能項目管理

2023-10-07 16:28:01

2024-12-27 08:14:28

2023-02-22 16:43:05

Web開發github

2012-12-27 09:56:34

IaaSPaaS數據庫

2024-12-03 14:33:42

Python遞歸編程

2023-07-25 16:14:51

Python技巧

2024-08-19 00:20:00

Python

2024-07-18 15:08:27

2022-04-08 08:11:44

自定義鉤子Vuejs

2023-09-27 22:10:47

Vue.jsJavaScript

2021-12-02 14:55:44

Python項目編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费一区二区三区视频网站 | 不卡一区 | 人人看人人射 | 欧美激情综合 | 国产精品伦一区二区三级视频 | 欧美亚洲第一区 | 日韩在线资源 | 在线免费观看黄a | 人人干在线视频 | 夜夜艹| 欧美一级片久久 | 呦呦在线视频 | 久久久久久久av | 伊大人久久 | 天天曰天天曰 | 午夜在线小视频 | 伊人网站视频 | av资源网站| 国产专区在线 | 热久久999 | 精品二区| 天天拍天天操 | 天天干天天操天天看 | 中文一区| 99综合| 理论片免费在线观看 | 久久精品91久久久久久再现 | 91精品国产乱码久久久久久 | www.欧美| 亚洲精品乱码久久久久久按摩观 | 五月精品视频 | 久草网站 | 中文字幕av一区 | 亚洲精品国产第一综合99久久 | 97日日碰人人模人人澡分享吧 | 久久男人 | 福利av在线 | 亚洲午夜一区二区 | 国产一二三视频在线观看 | 精品欧美乱码久久久久久 | www.久久久.com|