반응형
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
반응형
'Python' 카테고리의 다른 글
[Python] list 를 text file 에 한줄씩 쓰기 ( \n 안나오게 ) (0) | 2020.09.05 |
---|---|
[Python] scheduler 사용하기 #APScheduler (2) | 2020.09.04 |
Python Decorator 란? 사용 방법. #Python Decorator (0) | 2020.09.03 |
[pyQT5] pyQT Button. 버튼 클릭 이벤트 #pyQT Button (0) | 2020.08.15 |
[pyQT5] pyQT 창띄우기 위치설정. Center 로 띄우기. (0) | 2020.08.15 |
댓글