То, что вы хотите, это изменить сообщение об ошибке, когда отображается для пользователя. Один из способов сделать это - определить свой собственный , за исключением .
Ваша собственная функция может:
- поиск вызывающего кадра в объекте трассировки (который содержит информацию об исключении
TypeError
и функции, которая делает это),
- поиск объекта
Bar
в локальных переменных,
- изменить сообщение об ошибке, если объект является модулем, а не классом или функцией.
В Foo.__init__.py
вы можете установить свой exchook
import inspect
import sys
def _install_foo_excepthook():
_sys_excepthook = sys.excepthook
def _foo_excepthook(exc_type, exc_value, exc_traceback):
if exc_type is TypeError:
# -- find the last frame (source of the exception)
tb_frame = exc_traceback
while tb_frame.tb_next is not None:
tb_frame = tb_frame.tb_next
# -- search 'Bar' in the local variable
f_locals = tb_frame.tb_frame.f_locals
if 'Bar' in f_locals:
obj = f_locals['Bar']
if inspect.ismodule(obj):
# -- change the error message
exc_value.args = ("'module' object is not callable, perhaps you meant to call 'Foo.Bar.Bar()'",)
_sys_excepthook(exc_type, exc_value, exc_traceback)
sys.excepthook = _foo_excepthook
_install_foo_excepthook()
Конечно, вам нужно применить этот алгоритм ...
со следующей демонстрацией:
# coding: utf-8
from Foo import Bar
s = Bar('a')
Вы получаете:
Traceback (most recent call last):
File "/path/to/demo_bad.py", line 5, in <module>
s = Bar('a')
TypeError: 'module' object is not callable, perhaps you meant to call 'Foo.Bar.Bar()'