如何在不重复代码的前提下有条件地使用Python的with语句?
条件性使用
with语句避免代码重复 针对你遇到的「满足特定条件才用with,又不想重复写代码块」的问题,有几种简洁的实现方式,结合你的PyTorch场景举例:
方法一:使用contextlib.nullcontext(Python 3.7+ 推荐)
利用标准库提供的空上下文管理器,它在with块中不会执行任何操作,完美适配条件场景:
from contextlib import nullcontext import torch # 根据模式选择对应的上下文 ctx = torch.no_grad() if is_eval_mode else nullcontext() with ctx: run_batch(features, labels)
不管是训练还是评估模式,代码块只需要写一次,后续维护只改这一处即可。
方法二:自定义空上下文管理器(兼容低版本Python)
如果你的Python版本低于3.7,自己写一个极简的空上下文管理器就行:
import torch class NullContext: def __enter__(self): pass def __exit__(self, exc_type, exc_val, exc_tb): pass ctx = torch.no_grad() if is_eval_mode else NullContext() with ctx: run_batch(features, labels)
方法三:封装代码块为函数
如果不想用上下文管理器的思路,把重复的代码块封装成函数,也能避免重复编写逻辑:
import torch def process_batch(): run_batch(features, labels) if is_eval_mode: with torch.no_grad(): process_batch() else: process_batch()
这种方式虽然需要两次调用函数,但核心逻辑只在函数里维护一次,比最初的重复代码块方案更易维护。
内容的提问来源于stack exchange,提问作者BioBroo
相关产品推荐
相关产品推荐

