【问题标题】:Why isn't IPython giving me a full traceback for a module I've written?为什么 IPython 没有为我编写的模块提供完整的回溯?
【发布时间】:2013-11-20 05:12:18
【问题描述】:

我很困惑,为什么当我编写的模块内的函数中出现错误时,IPython 没有向我显示函数中导致错误的行的完整回溯。

注意:我对这个特定错误的原因并不感到困惑,而是为什么 IPython 没有向我显示原因。

我的模块名为module.py,它包含函数function,在其下方写入了一个if __name__ == '__main__' 块。 (模块和函数名称已更改以保护无辜者的身份——或者可能不是那么无辜。)

这是我在引发错误时得到的回溯。 (请注意缺少关于 function 中哪一行导致错误的信息。)

In [1]: import module as m

In [2]: call = m.function('hello')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ec0c1e40ec8c> in <module>()
----> 1 call = m.function('hello')

/home/module.py in function(greeting)

TypeError: join() takes exactly one argument (2 given)

【问题讨论】:

  • 我不知道 IPython,但为什么会出现这个问题?该错误包含您需要的所有信息。
  • 您能否详细说明if __name__ == "__main__" 位?该块中是否定义了函数?如果是这样,我不确定你的函数调用是如何工作的。能给个模块的SSCCE吗?
  • 错误没有我需要的所有信息。例如,假设function 中有很多join() 调用。回溯并没有告诉我是哪一个引发了错误。这是不寻常的;回溯通常会将我指向源代码中引发错误的行。这种情况有些不同,我不确定是什么。
  • 根据您的描述,我无法重现该错误。我用一个简单地引发TypeError 的函数和一个只有一个打印语句的if __name__ == "__main__": 块创建了module.py。这会为您产生错误吗?如果没有,你能想出一个最小的例子来重现错误吗?如果是这样,您能否提供一些设置的详细信息(Python 版本、Ipython 版本等)?
  • 不,该函数未在if __name__ == '__main__' 块中定义。那太离谱了。此外,在我的问题中,我声明这个块在函数的“下方”。澄清一下,if __name__ == '__main__' 块位于已完成的函数定义下方,位于 return 语句下方。

标签: python ipython traceback


【解决方案1】:

您尝试过%xmode 吗?

In [2]: %xmode?
Type:       Magic function
Definition: %xmode(self, parameter_s='')
Docstring:
Switch modes for the exception handlers.

Valid modes: Plain, Context and Verbose.

If called without arguments, acts as a toggle.

如果你仔细看,下面的 2 个例子是不同的,但是长回溯时差异更明显:

In [8]: raise ValueError('Foo')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-05e81bf5c607> in <module>()
----> 1 raise ValueError('Foo')
        global ValueError = undefined

ValueError: Foo

普通模式

In [9]: xmode
Exception reporting mode: Plain

In [10]: raise ValueError('Foo')
Traceback (most recent call last):
  File "<ipython-input-10-05e81bf5c607>", line 1, in <module>
    raise ValueError('Foo')
ValueError: Foo

【讨论】:

  • 这解决了我的问题。然而,当使用 Python3 'raise ... from' 格式时,Ipython 的 'Plain' xmode 并没有提供所有预期的回溯。它仅适用于“上下文”和“详细”模式。顺便说一句,“详细”模式有点过头了。
  • 我没有尝试过,但因为它对@idichekop 有效,所以我接受了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多