如何阻止方法

时间:2015-08-31 14:51:04

标签: python twitter

所以我使用第三方库中的method_x,每次使用时都会打印警告。由于我编写了一些用于从cli获取用户输入的内容,我想阻止这些恼人的打印。

import module_x

module_x.method_x() # Has expected behaviour but prints an annoying warning

我能做些什么来阻止函数内的所有print语句?也许用某种东西包装方法或暂时禁用stdout?

编辑:我最终使用了一个记录模块的方法来捕获警告并将它们重定向到日志文件。这是我做的装饰者:

logging.basicConfig(filename='log/log', level=logging.WARNING)

class redirect_warnings_to_log(object):
    def __init__(self, f):
        self.f = f

    def __call__(self, args):
            logging.captureWarnings(True)
            self.f(args)
            logging.captureWarnings(False)

这是打印警告的装饰方法:

@redirect_warnings_to_log
def tweet(message):
    twt = api.PostUpdate(message)

2 个答案:

答案 0 :(得分:4)

正如问题所说 -

  

我使用第三方库中的method_x,每次使用时都会输出警告

如果method_x正在使用Python的warnings模块。然后,您可以使用warnings.catch_warnings()以及with语句和warnings.simplefilter()来忽略警告,以便抑制警告。

示例 -

>>> import warnings
>>> def f():
...     warnings.warn("Some warning!")
...
>>> f()
__main__:2: UserWarning: Some warning!
>>> with warnings.catch_warnings():
...     warnings.simplefilter("ignore")
...     f()
...

请注意,这只是暂时禁止警告,仅在with块中,在if块之外使用f(),然后它不会禁止这些警告。

来自documentation -

  

在上下文管理器中,所有警告都将被忽略。这允许您使用已知弃用的代码,而不必查看警告,同时不抑制可能不知道其使用已弃用代码的其他代码的警告。注意:这只能在单线程应用程序中得到保证。如果两个或多个线程同时使用catch_warnings上下文管理器,则行为未定义。

答案 1 :(得分:2)

如果代码实际上使用的是print语句而不是临时重定向head(或stdout)可能是最佳选择。

一种简单的方法:

stderr