Traceback에서 Last Function의 호출 인수를 얻습니까?
-
22-07-2019 - |
문제
Traceback에서 호출 된 마지막 함수의 매개 변수를 얻을 수 있습니까? 어떻게?
읽을 수있는 코드를 만들기 위해 표준 오류를 포수로 만들고 싶지만 사용자에게 자세한 정보를 제공하고 싶습니다.
다음 예에서는 get_params가 os.chown에 제공된 매개 변수의 튜플을 반환하기를 원합니다. 검사 inspect
Alex Martelli가 조언 한 모듈은 찾을 수 없었습니다.
def catch_errors(fn):
def decorator(*args, **kwargs):
try:
return fn(*args, **kwargs)
except (IOError, OSError):
msg = sys.exc_info()[2].tb_frame.f_locals['error_message']
quit(msg.format(SEQUENCE_OF_PARAMETERS_OF_THE_LAST_FUNCTION_CALLED)\
+ '\nError #{0[0]}: {0[1]}'.format(sys.exc_info()[1].args), 1)
return decorator
@catch_errors
def do_your_job():
error_message = 'Can\'t change folder ownership \'{0}\' (uid:{1}, gid:{2})'
os.chown('/root', 1000, 1000) # note that params aren't named vars.
if __name == '__main__' and os.getenv('USERNAME') != 'root':
do_your_job()
(감사합니다 짐 로버트 데코레이터를 위해)
해결책
달성하려는 일을 위해 데코레이터를 사용하는 데있어 문제는 예외 핸들러가 얻는 프레임이 do_your_job()
S, 그렇지 않습니다 os.listdir()
에스, os.makedirs()
s 또는 os.chown()
에스. 그래서 인쇄 할 정보는 do_your_job()
. 내가 생각하는 행동을 얻으려면, 당신은 당신이 부르는 모든 라이브러리 기능을 장식해야 할 것입니다.
다른 팁
그러한 검사 작업의 경우 항상 모듈의 첫 번째 생각 inspect
표준 라이브러리에서. 여기, 검사 .getArgValues 프레임이 주어진 인수 값을 제공하고 검사 .getinnerframes 트레이스 백 객체에서 관심있는 프레임을 제공합니다.
다음은 이러한 기능의 예와 여러분이 얻을 수없는 몇 가지 문제입니다.
import sys
def get_params(tb):
while tb.tb_next:
tb = tb.tb_next
frame = tb.tb_frame
code = frame.f_code
argcount = code.co_argcount
if code.co_flags & 4: # *args
argcount += 1
if code.co_flags & 8: # **kwargs
argcount += 1
names = code.co_varnames[:argcount]
params = {}
for name in names:
params[name] = frame.f_locals.get(name, '<deleted>')
return params
def f(a, b=2, c=3, *d, **e):
del c
c = 4
e['g'] = 6
assert False
try:
f(1, f=5)
except:
print get_params(sys.exc_info()[2])
출력은 다음과 같습니다.
{'a': 1, 'c': 4, 'b': 2, 'e': {'g': 6, 'f': 5}, 'd': ()}
나는 사용하지 않았다 inspect.getinnerframes()
필요한 프레임을 얻는 또 다른 방법을 보여줍니다. 약간 단순화되지만 상대적으로 느리면서도 필요하지 않은 추가 작업도 수행합니다 (inspect.getinnerframes()
Traceback의 모든 모듈에 대한 소스 파일을 읽습니다. 이것은 하나의 디버깅 호출에 중요하지 않지만 다른 경우에는 문제가 될 수 있습니다).