【发布时间】:2023-03-08 03:42:01
【问题描述】:
我正在尝试实现一个系统来帮助用户调用函数/方法。
我知道用户可以通过help(function) 获取我提供的某种文档,但我想重新实现TypeError 如果可用,它也会打印该文档。
例如:
假设我有:
def foo(bar):
''' Adds 1 to 'bar' and prints output '''
print 1+bar
用户决定调用foo()(不带参数)
它会引发这样的 TypeError:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-624891b0d01a> in <module>()
----> 1 foo()
TypeError: foo() takes exactly 1 argument (0 given)
我希望它也能打印来自help(foo) 的信息。即:
foo(bar)
Adds 1 to 'bar' and prints output
关于如何做到这一点的任何想法?我意识到我需要
- 检测引发 TypeError 的函数
- 获取该函数的帮助文本
- 将其添加到引发的 TypeError 中。
对于 1) 这似乎有效:
import sys, traceback
# Get latest traceback information
tb = sys.exc_info()[-1]
stk = traceback.extract_tb(tb, 1)
# Extract called function and remove '()' - This actually limits functionality as the user might had inputed some extra arguments for example
fname = stk[0][-1]
fname = str(fname).split('()')[0]
对于 2) 和 3) 并且不知道如何继续... =/
非常感谢!
Edit for 3) 我正在尝试覆盖 TypeError 的默认行为,但到目前为止没有成功。 我创建了一个新的 MyError 类只是为了对其进行测试并制作:
import exceptions
exception.TypeError = MyError
但是每当引发 TypeError 时,都会出现原始版本而不是 MyError
编辑2好的,发现我确实需要重写sys.excepthook方法。
作为测试,我创建了:
import sys
def handler(exc, value, tb):
print 'Oops'
sys.excepthook = handler
但是,无论何时发生错误,它仍然会带来原始错误,而不是“糟糕”消息。此外,sys.excepthook 仍然返回原始消息:
<bound method TerminalInteractiveShell.excepthook of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x10f4320d0>>
我也尝试过覆盖 IPython.terminal.interactiveshell.TerminalInteractiveShell.excepthook,但没有成功。
关于如何继续前进的任何想法?
【问题讨论】:
-
有处理未捕获异常的
sys.excepthook函数。您应该使用它来查看TypeError何时发生。但是这可能与 IPython 等使用的excepthook冲突,但应该很容易将一些信息添加到异常并调用 ipython 的钩子。 -
我刚刚尝试使用 IPython 进行一些测试,但您似乎根本无法更改
sys.excepthook的输出,因为无法覆盖它。