본문 바로가기
Python

Python Decorator 파라메터 사용하기 #decorator parameter

by bryan.oh 2020. 9. 3.
반응형

Python Decorator
Parameter

Python Decorator 의 개념은 이전 글에서 보시고

2020/09/03 - [Python] - Python Decorator 란? 사용 방법. #Python Decorator

바로 소스 코드 보시죠.

이번 샘플 소스는 각 메소드에서 오류 발생 시 처리를 Decorator 에서 하도록 하기위함입니다.

우선 데코레이터 없는 소스

class some_class():
    def __init__(self):
        self.resJson = {}
    def setResponse(self, resJson):
        self.resJson = resJson
        
    def isSuccess(self):
        try:
            return self.resJson['code']==0
        except Exception as e:
            print(f'ERR isSuccess() : message = {str(e)}')
            return False
        

    def getMessage(self):
        try:
            return self.resJson['message']
        except Exception as e:
            print(f'ERR getMessage() : message = {str(e)}')
            return 'It is default message'

    def getItemCnt(self):
        try:
            return len(self.resJson['items'])
        except Exception as e:
            print(f'ERR getItemCnt() : message = {str(e)}')
            return -1

try, exception 으로 반복이 많이 됩니다.

이렇게 소스를 개발했는데 상사가 
"exception 이 발생하면 개발자에게 메일을 보내는 기능을 추가해주세요" 라고 한다면..
메소드하나 만들고 exception 안에 다 넣어야겠죠. 만약에 메소드가 10개, 20개라면 노가다 시작입니다..

이걸 decorator 로 바꿔봅시다.

공통점이 있네요. try 문으로 감싸지고 오류났을 경우 기본값으로 리턴합니다.

그런데 기본값이 각각 다릅니다.

그거슨, @decorator('value') 

이런식으로 사용하면 됩니다. 아래 소스에서 파라메터 부분 확인해보세요.

 

데코레이터를 사용한 소스

import json

class exceptionDec(object):
    def __init__(self, flag):
        self.flag = flag
    def __call__(self, func):
        decorator_self = self
        def wrappee(*args, **kwargs):
            try:
                return func(*args,**kwargs)
            except Exception as e:
                print(f'ERR {func.__name__}() : {str(e)}')
                return decorator_self.flag
        return wrappee

class some_class():
    def __init__(self):
        self.resJson = {}
    def setResponse(self, resJson):
        self.resJson = resJson
    @exceptionDec(False)
    def isSuccess(self):
        return self.resJson['code']==0
    @exceptionDec('It is default message')
    def getMessage(self):
        return self.resJson['message']
    @exceptionDec(-1)
    def getItemCnt(self):
        return len(self.resJson['items'])

some = some_class()
# 설정을 안하면, some.setResponse({'code':1, 'message':'smtp error', 'items':[]})
print(some.getMessage())

결과는 

ERR getMessage() : 'message'
It is default message

응용해서 파라메터 여러개 사용 가능합니다.

 

여기서는 wrappee 의 excepton 안에만 개발자에게 메일 알림 기능을 추가하면 되겠네요.

 

728x90
반응형

댓글