You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:09:23