什么是__traceback_hide__的用法

时间:2016-09-07 04:39:53

标签: python

我在一些函数中看到过这行代码

__traceback_hide__ = True 

它做什么?它似乎试图压制错误追溯。在什么情况下应该隐藏回溯?

4 个答案:

答案 0 :(得分:6)

__tracebackhide__可以设置为在使用PyTest时隐藏回溯中的函数。出于同样的目的,似乎在Python Paste包中使用了__traceback_hide__

以下是paste.exceptions.collector文档对此所说的内容:

  

如果设置为true,则表示应该从缩略的回溯中隐藏框架。这样,您可以隐藏更大框架的一些复杂性,让用户专注于自己的错误。

     

通过在'之前将其设置为',此前的所有帧都将被丢弃。通过将其设置为'之后'那么之后的所有帧都将被丢弃,直到“重置”为止。找到了。在每种情况下,都包括设置它的框架,除非你附加了“_and_this'价值(例如,' before_and_this')。

     

请注意,如果根据这些规则通常不会显示包含错误的帧,格式化程序将完全忽略它。

__tracebackhide__上的PyTest documentation

  

如果您有一个从测试中调用的测试助手函数,则可以使用pytest.fail标记来使测试失败并使用某个消息。如果在辅助函数中的某处设置__tracebackhide__选项,则测试支持函数不会显示在回溯中。

所以基本上,它们是为了避免使用测试帮助函数或其他您不知道的函数来解决您的回溯问题。

答案 1 :(得分:3)

看起来这是mostly a convenience for web frameworks(Sentry,werkzeug,Paste,Django),因此框架功能不包含在框架的高级异常报告功能中。

确切的行为可能因框架而异,例如,对于特定的粘贴,它记录为:

  

如果设置为true,则表示应该从缩略的回溯中隐藏框架。这样,您可以隐藏更大框架的一些复杂性,让用户专注于自己的错误。

     

通过将其设置为“之前”,此之前的所有帧都将被丢弃。通过将其设置为“之后”,之后的所有帧将被丢弃,直到找到“重置”。在每种情况下,都包括设置它的框架,除非您在该值上附加“_and_this”(例如,'before_and_this')。

     

请注意,如果根据这些规则通常不会显示包含错误的帧,格式化程序将完全忽略它。

它不是标准变量,核心Python解释器不支持它。

答案 2 :(得分:1)

用Google搜索" python __traceback_hide __",我了解到它的目的是让一个复杂的框架通过从异常打印输出中抑制一些堆栈帧来隐藏其内部工作的一部分,这样用户就可以不要混淆许多无关的输出。

答案 3 :(得分:0)

隐藏回溯可以为您提供更全面的测试输出。

考虑测试Web API端点/running返回JSON响应{"running": true}

import pytest
import json

def test_running(client):
    action_response = client.get('/running')
    assert parse_as_json(action_response) == {'running': True}

def parse_as_json(response):
    __tracebackhide__ = True  # <---- Point of interest
    try:
        return json.loads(response.data)
    except json.decoder.JSONDecodeError:
        pass
    pytest.fail(f'Expected JSON, but got {response.data}')

如果测试失败(因为JSON格式错误),则失败将显示为

__________________________ test_running _________________________

client = <FlaskClient <Flask 'webapi'>>

    def test_running(client):
        action_res = client.get('/running')
>       assert parse_as_json(action_res) == {'running': True}
E       Failed: Expected JSON, but got b'ok'

webapi_test.py:22: Failed
=============== 1 failed, 1 passed in 0.15 seconds ===============

而没有__tracebackhide__ = True的输出将是

__________________________ test_running _________________________

client = <FlaskClient <Flask 'webapi'>>

    def test_running(client):
        action_res = client.get('/running')
>       assert parse_as_json(action_res) == {'running': True}

webapi_test.py:22: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

client = <FlaskClient <Flask 'webapi'>>

    def test_running(client):
        action_res = client.get('/running')
>       assert parse_as_json(action_res) == {'running': True}
E       Failed: Expected JSON, but got b'ok'

webapi_test.py:22: Failed
=============== 1 failed, 1 passed in 0.17 seconds ===============