跳转至

Python常用的装饰器

测量执行时间

优化代码性能是非常重要的。@timer装饰器可以帮助我们跟踪特定函数的执行时间。通过用这个装饰器包装函数,我可以快速识别瓶颈并优化代码的关键部分。下面是它的工作原理:

import time

 def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.name} took {end_time - start_time:.2f} seconds to execute.")
        return result
    return wrapper
 @timer
 def my_data_processing_function():
    # Your data processing code here
将@timer与其他装饰器结合使用,可以全面地分析代码的性能。

忽略错误

import os
from requests import post

def ignorerr(url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=1111111"):
    def ignorerr_url(func):
        def wrapper(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except Exception as e:
                function_info = f"文件 `{os.path.basename(func.__code__.co_filename)}`、方法 `{func.__name__}`、报错信息 `{e}`"
                markdown = {
                    "msgtype": "markdown",
                    "markdown": {
                        "content": function_info
                    }
                }
                post(url, json=markdown)
        return wrapper
    return ignorerr_url

@ignorerr(url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=22222222")
def ccc(a):
    xxx
    print(1)

缓存结果

def memoize(func):
    cache = {}

 def wrapper(*args):
        if args in cache:
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result
    return wrapper
 @memoize
 def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

数据验证

def validate_input(func):
    def wrapper(*args, **kwargs):
        # Your data validation logic here
        if valid_data:
            return func(*args, **kwargs)
        else:
            raise ValueError("Invalid data. Please check your inputs.")

 return wrapper
 @validate_input
 def analyze_data(data):
    # Your data analysis code here

日志输出

def log_results(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        with open("results.log", "a") as log_file:
            log_file.write(f"{func.name} - Result: {result}\n")
        return result

 return wrapper
 @log_results
 def calculate_metrics(data):
    # Your metric calculation code here

优雅的错误处理

def suppress_errors(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print(f"Error in {func.name}: {e}")
            return None

 return wrapper
 @suppress_errors
 def preprocess_data(data):
    # Your data preprocessing code here

确保质量结果

def validate_output(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        if valid_output(result):
            return result
        else:
            raise ValueError("Invalid output. Please check your function logic.")

 return wrapper
 @validate_output
 def clean_data(data):
    # Your data cleaning code here

重试执行

import time

 def retry(max_attempts, delay):
    def decorator(func):
        def wrapper(*args, **kwargs):
            attempts = 0
            while attempts < max_attempts:
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"Attempt {attempts + 1} failed. Retrying in {delay} seconds.")
                    attempts += 1
                    time.sleep(delay)
            raise Exception("Max retry attempts exceeded.")
        return wrapper
    return decorator
 @retry(max_attempts=3, delay=2)
 def fetch_data_from_api(api_url):
    # Your API data fetching code here

漂亮的可视化

import matplotlib.pyplot as plt

 def visualize_results(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        plt.figure()
        # Your visualization code here
        plt.show()
        return result
    return wrapper
 @visualize_results
 def analyze_and_visualize(data):
    # Your combined analysis and visualization code here

调试变得更容易

1
2
3
4
5
6
7
8
9
def debug(func):
    def wrapper(*args, **kwargs):
        print(f"Debugging {func.name} - args: {args}, kwargs: {kwargs}")
        return func(*args, **kwargs)

 return wrapper
 @debug
 def complex_data_processing(data, threshold=0.5):
    # Your complex data processing code here

处理废弃的函数

import warnings

 def deprecated(func):
    def wrapper(*args, **kwargs):
        warnings.warn(f"{func.name} is deprecated and will be removed in future versions.", DeprecationWarning)
        return func(*args, **kwargs)
    return wrapper
 @deprecated
 def old_data_processing(data):
    # Your old data processing code here