При написании моего собственного обработчика исключений в python, я пришел к мысли использовать inspect
-модуль, чтобы предоставить myselfe больше информации о том, как вызывается функция.
Это означает подпись функции, а также аргументы , переданные ей.
import inspect
frame_infos = inspect.trace() # get the FrameInfos
for f_idx, f_info in enumerate(frame_infos):
frame_dict.update(f_info.frame.f_locals) # update namespace with deeper frame levels
#Output basic Error-Information
print(f' File "{f_info.filename}", line {f_info.lineno}, in {f_info.function}')
for line in f_info.code_context:
print(f' {line.strip()}')
########################################################
# show signature and arguments 1 level deeper
if f_idx+1 < len(frame_infos):
func_name = frame_infos[f_idx+1].function #name of the function
try:
func_ref = frame_dict[func_name] # look up in namespace
sig = inspect.signature(func_ref) # call signature for function_reference
except KeyError: sig = '(signature unknown)'
print(f' {func_name} {sig}\n')
print(f' {frame_infos[f_idx+1].frame.f_locals}\n')
Это прекрасно работает с базовым примером, подобным этому:
def test1 ( x: int, y: tuple = 0 )->list: # the types obviously dont match
return test2(y, b=x, help=0)
def test2 ( a, *args, b, **kwargs ):
return a + b / 0
try:
test1(5)
except: ...
output:
File "C:/test/errorHandler.py", line 136, in <module>
test1(5)
test1 (x:int, y:tuple=0) -> list
{'y': 0, 'x': 5}
File "C:/test/errorHandler.py", line 130, in test1
return test2(y, b=x, help=0)
test2 (a, *args, b, **kwargs)
{'kwargs': {'help': 0}, 'args': (), 'b': 5, 'a': 0}
File "C:/test/errorHandler.py", line 133, in test2
return a + b / 0
но, как только вы покидаете 1 файл, вы не можете сопоставить имя функции с базовым пространством имен.
file1: import file2; try: file2.foo() except: ...
file2: import file3; def foo(): file3.foo()
file3: def foo(): return 0/0
так важно, я ищу способ получить функцию (например, <function foo at 0x000002F4A43ACD08>
) из FrameInfo
илиframe
-объект, но единственная информация, которую я вижу, это имя, файл и строка.
(Мне не нравится идея получить подпись, посмотрев в исходный файл на определенную строку.)
Лучшим справочным документом до сих пор была Inspect
-документация ,но я еще не нашел что-то полезное.