如何在Jupyter Notebook中默认屏蔽log_step装饰器的输出
解决方案
要实现保留@log_step装饰器、默认在Jupyter Notebook不输出、可按需开启打印的需求,我们可以通过「带参数的装饰器」+「Jupyter环境检测」来实现,具体步骤如下:
1. 实现Jupyter环境检测函数
先写一个辅助函数,用来判断当前运行环境是否是Jupyter Notebook:
def is_jupyter(): try: from IPython import get_ipython # 检查是否在IPython内核中运行 return 'IPKernelApp' in get_ipython().config except (ImportError, AttributeError): return False
2. 修改log_step为带参数的装饰器
把原来的无参装饰器改成支持开关参数的版本,默认根据环境自动决定是否打印:
from functools import wraps import datetime as dt def log_step(enable=None): # 处理默认逻辑:如果未指定enable,Jupyter环境默认关闭,其他环境默认开启 if enable is None: enable = not is_jupyter() def decorator(func): @wraps(func) def wrapper(*args, **kwargs): tic = dt.datetime.now() result = func(*args, **kwargs) time_taken = str(dt.datetime.now() - tic) # 只有enable为True时才打印日志 if enable: print(f"just ran step {func.__name__} shape={result.shape} took {time_taken}s") return result return wrapper return decorator
3. 使用方式
默认使用(自动适配环境)
在Jupyter中默认不打印日志,其他环境默认打印:
import pandas as pd df = pd.read_csv('https://calmcode.io/datasets/bigmac.csv') # 默认:Jupyter不打印,其他环境打印 @log_step() def start_pipeline(dataf): return dataf.copy() @log_step() def set_dtypes(dataf): return (dataf .assign(date=lambda d: pd.to_datetime(d['date'])) .sort_values(['currency_code', 'date'])) # 调用流水线 processed_df = (df .pipe(start_pipeline) .pipe(set_dtypes))
强制开启/关闭打印
不管当前环境是什么,手动指定打印状态:
# 强制开启打印(即使在Jupyter中也会输出) @log_step(enable=True) def filter_regions(dataf): return dataf[dataf['name'].str.contains('Europe')] # 强制关闭打印(即使在普通Python脚本中也不输出) @log_step(enable=False) def add_calculations(dataf): return dataf.assign(bigmac_index=lambda d: d['local_price'] / d['dollar_ex'])
关键逻辑说明
- 环境检测:通过IPython的配置判断是否在Jupyter环境,避免误判;
- 带参数装饰器:多一层嵌套实现参数传递,同时用
@wraps(func)保留原函数的名称、文档等元信息; - 按需开关:默认逻辑适配Jupyter场景,同时支持手动强制开启/关闭,兼顾灵活性。
内容的提问来源于stack exchange,提问作者user19667366
相关产品推荐
相关产品推荐

