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
|
调试变得更容易
| 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
|