偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Python,十個(gè)高效有用的裝飾器

開發(fā)
在實(shí)際應(yīng)用中,我們只需在目標(biāo)函數(shù)或類之前添加 @ 符號(hào),即可快速便捷地應(yīng)用裝飾器。接下來,開發(fā)常用的10種裝飾器示例代碼:

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

本質(zhì)上,裝飾器是一個(gè)函數(shù),它以其他函數(shù)或類作為輸入?yún)?shù),經(jīng)處理后返回一個(gè)新的函數(shù)或類。

在實(shí)際應(yīng)用中,我們只需在目標(biāo)函數(shù)或類之前添加 @ 符號(hào),即可快速便捷地應(yīng)用裝飾器。

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

1. @timer

用于統(tǒng)計(jì)函數(shù)執(zhí)行時(shí)間,對(duì)性能分析極為有利,可迅速定位代碼中的性能瓶頸。

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__} 耗時(shí): {end - start:.4f}s")
        return result
    return wrapper

2. @debug

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

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

當(dāng)網(wǎng)絡(luò)請(qǐng)求等操作失敗時(shí),此裝飾器能自動(dòng)進(jìn)行重試,有效增強(qiáng)程序的魯棒性。

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

用于標(biāo)記已過時(shí)的函數(shù),提醒用戶及時(shí)替換為新函數(shù)。

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 中,用于檢查用戶是否具備相應(yīng)的權(quán)限,如是否為 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

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

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

確保用戶已認(rèn)證登錄,防止未經(jīng)授權(quán)的操作。

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

將函數(shù)輸出持久化保存,方便后續(xù)查看函數(shù)運(yùn)行結(jié)果。

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 調(diào)用頻率,防范 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

確保一個(gè)類只有一個(gè)實(shí)例,在特定場(chǎng)景下非常有用。

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

熟練掌握裝飾器的運(yùn)用,能夠極大簡(jiǎn)化開發(fā)流程,使代碼更加健壯可靠。在大型項(xiàng)目開發(fā)中,借助裝飾器實(shí)現(xiàn)關(guān)注點(diǎn)分離,如將日志記錄、權(quán)限管理等功能與核心業(yè)務(wù)邏輯分開處理,可顯著提升開發(fā)效率。

責(zé)任編輯:趙寧寧 來源: 程序員老朱
相關(guān)推薦

2023-08-02 16:14:04

2024-02-01 12:53:00

PandasPython數(shù)據(jù)

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

2025-07-09 09:10:00

2024-09-03 09:44:03

2023-10-07 16:28:01

2021-01-27 11:24:00

項(xiàng)目經(jīng)理技術(shù)技能項(xiàng)目管理

2023-02-22 16:43:05

Web開發(fā)github

2024-12-27 08:14:28

2012-12-27 09:56:34

IaaSPaaS數(shù)據(jù)庫

2024-12-03 14:33:42

Python遞歸編程

2023-07-25 16:14:51

Python技巧

2024-08-19 00:20:00

Python

2022-04-08 08:11:44

自定義鉤子Vuejs

2023-09-27 22:10:47

Vue.jsJavaScript

2024-07-18 15:08:27

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)