Chr*_*nds 12 python module exception python-2.7 python-3.x
我是一个小包的贡献者,人们打算这样做(Foo.Bar.Bar是一个班级):
>>> from Foo.Bar import Bar
>>> s = Bar('a')
Run Code Online (Sandbox Code Playgroud)
有时候人们会误做(这Foo.Bar是一个模块):
>>> from Foo import Bar
>>> s = Bar('a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
Run Code Online (Sandbox Code Playgroud)
这可能看起来很简单,但用户仍然无法调试它,我想让它更容易.我无法更改名称Foo或Bar但我想添加更多信息性的回溯,如:
TypeError("'module' object is not callable, perhaps you meant to call 'Bar.Bar()'")
我读了Callable模块 Q&A,我知道我不能__call__在模块中添加一个方法(我不想为了这个而将整个模块包装在一个类中).无论如何,我不希望模块可以调用,我只想要一个自定义的回溯.Python 3.x和2.7+有一个干净的解决方案吗?
有很多方法可以获得不同的错误消息,但它们都有奇怪的警告和副作用。
__class__用子类替换模块types.ModuleType可能是最干净的选择,但它仅适用于 Python 3.5+。
除了 3.5+ 的限制之外,我想到的这个选项的主要奇怪副作用是该模块将被报告为可由函数调用callable,并且重新加载模块将再次替换其类,除非您小心避免这种双重-替代品。
用不同的对象替换模块对象适用于 3.5 之前的 Python 版本,但要完全正确是非常困难的。
子模块、重新加载、全局变量、除了自定义错误消息之外的任何模块功能……如果您错过了实现的一些微妙方面,所有这些都可能会中断。此外,该模块将被报告为可调用callable,就像__class__替换一样。
尝试在引发异常后修改异常消息(例如在sys.excepthook, 中)是可能的,但没有一个好方法来告诉任何特定消息是否TypeError来自尝试将模块作为函数调用。
也许您能做的最好的事情就是在名称空间中检查带有消息的 a ,TypeError在'module' object is not callable该名称空间中,您的模块看起来可能被调用 - 例如,如果名称Bar绑定到Foo.Bar框架的局部变量或全局变量中的模块 - 但是仍然会有大量的误报和误报。另外,sys.excepthook替换与 IPython 不兼容,无论您使用什么机制都可能会与某些内容发生冲突。
现在,你遇到的问题很容易理解,也很容易解释。尝试更改错误消息时可能会遇到的问题可能更难以理解和解释。这可能不是一个值得的权衡。
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |