2020년 7월 12일 일요일

Python Decorator


Python 코드를 보다 보면 함수앞에 @ 붙은 문장이 보입니다.

@Decorator는 기존에 존재하는 function의 기능을 조작하여 새로운 function을 만들 수 있는 기능입니다. 함수를 한번 더 wrapping 할 수 있습니다.
A 라는 함수가 있고 이것을 조작해서 A' 함수를 만들 수 있습니다.

예를 들어보겠습니다. 이런 함수가 있고 kiwoom_CommConnect() 함수 실행한다면, @SyncRequestDecorator.kiwoom_sync_request 여기 문장에 의해

    @SyncRequestDecorator.kiwoom_sync_request
    def kiwoom_CommConnect(self, **kwargs):
        lRet = self.dynamicCall("CommConnect()")
        return lRet

SyncRequestDecorator.kiwoom_sync_request 여기로 진입하여 return func_wrapper 여기를 실행하게되고 func(self, *args, **kwargs)에 의해서kiwoom_CommConnect 함수가 실행되게 됩니다.  기존과 동일하다고 생각 할수 있지만 추가로 아래와 같은 코드가 실행되게 됩니다.
            self.event = QEventLoop()
            self.event.exec_()

class SyncRequestDecorator:
    @staticmethod
    def kiwoom_sync_request(func):
        def func_wrapper(self, *args, **kwargs):
            if kwargs.get('nPrevNext', 0) == 0:
                self.params = {}
                self.result = {}
            func(self, *args, **kwargs)
            self.event = QEventLoop()
            self.event.exec_()
            return self.result  # 콜백 결과 반환
        return func_wrapper

뭔가 복잡하지만 이렇게 사용하는 이유는 코드의 중복을 피하기 위해서 이런식으로 많이 사용합니다. 







댓글 없음:

댓글 쓰기