【问题标题】:Is there a way to force any function to not be verbose in Python?有没有办法强制任何函数在 Python 中不冗长?
【发布时间】:2021-01-07 07:54:44
【问题描述】:

通过 pytorch 加载预训练模型时

model.load_state_dict(torch.load(MODEL_PATH))

控制台充斥着包含模型信息的输出(这很烦人)。 Afaik 在model.load_state_dicttorch.load 中都没有详细选项。如果我忽略了这个参数,请告诉我。

但是,这让我想到是否有任何通用方法可以强制函数不冗长。可能是这样的:

with os.nonverbose():
   model.load_state_dict(torch.load(MODEL_PATH))

有什么想法吗?

【问题讨论】:

  • 不就是简单的使用标准的Pythonlogging模块吗?

标签: python pytorch verbosity


【解决方案1】:

正如@triplee 评论的那样,大多数库都将使用 Python 日志记录,可以对其进行广泛修改。我以前没有使用过 PyTorch,但从 https://github.com/pytorch/vision/issues/330 看来,它实际上是在使用 print(如果可以的话,这很可怕)。

通常,您可以通过重定向 stdout 来抑制任何内容的 stdout 输出。这是一个很好的链接https://wrongsideofmemphis.com/2010/03/01/store-standard-output-on-a-variable-in-python/

在您的问题中,您询问是否可以使用上下文管理器来完成。我不明白为什么不这样做,考虑到您想在函数调用后重置标准输出,这似乎是合适的。像这样的:

from io import StringIO  # Python3

import sys

class SilencedStdOut:
    def __enter__(self):
        self.old_stdout = sys.stdout
        self.result = StringIO()
        sys.stdout = self.result

    def __exit__(self, *args, **kwargs):     
 
        sys.stdout = self.old_stdout
        result_string = self.result.getvalue() # use if you want or discard.

但是,如果您只想抑制单个函数而不是代码块,那么装饰器也应该可以正常工作。

【讨论】:

  • 这是一个绝妙的解决方案,我从没想过在 python 中覆盖标准输出。
  • 在标准库中,还有contextlib.redirect_stdout,效果相同。
猜你喜欢
  • 2019-06-26
  • 2013-05-26
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2016-11-15
  • 2015-08-02
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多