如何有条件地使用命令“with”而不重复代码

Bio*_*roo 1 python with-statement pytorch

我试图with在执行代码块之前使用,但前提是满足条件,但(至少常见)的用法with似乎不支持这一点,除非我复制该代码块。

更具体地说,我知道我可以执行以下操作:

if condition:
    with blah_blah():
        my_code_block
else:
    my_code_block
Run Code Online (Sandbox Code Playgroud)

但这在开发过程中并不令人满意,因为我所做的任何更改都my_code_block必须进行两次。我想做的(概念上)是:

if condition:
    with blah_blah():
else:
    my_code_block
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。有办法完成我想做的事情吗?

对于任何对我的特定用途感兴趣的人,我正在尝试编写在 pytorch 中运行一批示例的代码,如果我处于评估模式,则使用 torch.no_grad() ;如果我处于训练模式,则不使用 torch.no_grad() 。所以我想做的就变成了

if mode == 'eval':
    with torch.no_grad():
else:
    run_batch(features, labels)
Run Code Online (Sandbox Code Playgroud)

che*_*ner 10

使用该with语句,但nullcontext必要时使用上下文管理器。

from contextlib import nullcontext

with blah_blah() if condition else nullcontext():
    my_code_block
Run Code Online (Sandbox Code Playgroud)

nullcontextwith接受一个可选参数,如果您的语句期望与 绑定某些内容,它将返回该参数as。例如,

with nullcontext("hello") as f:
    print(f)  # outputs "hello"
Run Code Online (Sandbox Code Playgroud)

  • 直到我了解到 nullcontext 是一件事。谢谢你! (2认同)