我正在尝试实现一个系统来帮助用户调用函数/方法。
我知道用户可以只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)
。IE:
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) 并且不知道如何进行... =/
非常感谢!
编辑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 没有成功。
关于如何继续前进的任何想法?