문제

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의 모든 모듈에 대한 소스 파일을 읽습니다. 이것은 하나의 디버깅 호출에 중요하지 않지만 다른 경우에는 문제가 될 수 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top