다른 사람들의 github를 보다 보면은요. 가끔씩 컨텍스트 매니저가 등장합니다.
이걸 처음 보면은요. 이해하기가 좀 어렵습니다.
왜냐하면 이해를 방해하는 건방지 문법 3가지 때문입니다.
이 3개는 각각 데코레이터, 일드, 위드문인데요.
전부 파이썬 초보들 겁주는데 도 같은 문법들이죠.
하지만 컨텍스트 매니저는요. 이 3문법의 원리로 이해하려고 하면 더 헷갈립니다.
대신에 영어 수가 외우듯이요 공식으로 외우면 오히려 쉽습니다
당장 데코레이터, 일드, 위드문의 의미를 몰라도 사용 패턴이 하나밖에 없기 때문에요
이 한 패턴만 알면 이해하기 쉽습니다
그래서 이 컨텍스트 매니저를 이해하고 나면요
특정 상황에서 욕이 나게 쓸 수 있습니다
저 같은 경우에는요 특정 코드 시간을 잴 때 있죠
딥러닝 모델 동작 속도를 확인하거나요
혹은 코드 동작이 느린 상황에서 범인인 줄을 찾을 때 유용하게 씁니다
이번 영상을 보고나면 컨텍스트 매니저도 쉽게 이해되고요
그리고 덤으로 시간을 잴 때 있죠 이때 고수같이 그리고 번거롭지 않고 편하게 잴 수 있을 겁니다. 일단 컨텍스트 매니저를 쓰는 상황부터 볼게요.
컨텍스트 매니저는요. 무조건 이런 상황에서만 씁니다.
코드에서 어떤 범위 앞뒤에서 어떤 다른 코드가 필요할 때 있죠.
대표적으로 아까 말한 코드 동작 시간을 재는 코드
앞에 시간 찍고 뒤에 시간 찍어서 뒤 시간에서 앞 시간 빼는 이런 앞뒤 코드 패턴 있죠.
이런 식으로 코드 범위 앞뒤에서 어떤 다른 코드가 필요할 때요.
이때 컨텍스트 매니저를 씁니다.
방금의 예시 코드 동작 시간 측정을 여러 구간에다가 한다면요.
어떻죠? 측정할 구간마다 덕지덕지입니다.
이러면 나중에 지우기도 귀찮고요.
좀 개초보 같아 보입니다.
이럴 때 컨텍스트 매니저를 쓰면 시간 측정처럼 자주 쓰는 앞뒤 코드 기능을요.
마치 함수로 재활용하듯이 쓸 수 있습니다.
그래서 이 이름도요 코드가 실행되는 앞뒤 상황인 컨텍스트를 관리 매니지해서 컨텍스트 매니저입니다.
컨텍스트 매니저를 쓰는 상황 이 상황은 알았죠. 이제 컨텍스트 매니저의 공식을 볼게요. 컨텍스트 매니저는 함수처럼요 선언이랑 사용 공식이 있습니다. 선언에서는 앞뒤 코드의 앞부분과 뒷부분이 있어야겠죠.
앞 코드는 일드의 앞이고요.
뒤 코드는 일드의 뒤입니다.
이렇게 선언하면은요.
컨텍스트 매니저를 사용할 때 있죠.
이때 메인의 중간 코드 앞에서 일드 앞을 실행하고요.
메인 중간 코드의 뒤에서는 일드 뒤를 실행합니다.
선언 공식을 알고 나니까 선언 코드는 간단하죠.
만약에 시간 측정 코드라면요.
일드 앞에 시작 시간 측정, 일드 뒤에 끝 시간 측정이랑 시간 차이 출력 이렇게 선언하면 됩니다.
아 그리고 한 가지 더 데프 앞에 atContextMajor를 붙여주셔야 합니다.
선언을 봤으니까 이제 사용방법을 볼게요.
선언도 간단했지만 사용방법은 더 간단합니다.
withContextMajor 이름 호출에 OO 중간 메인 코드로 사용합니다.
그러면 이 위드문에 들어갈 때 자동으로 일드의 앞부분을 실행하고요.
위드문이 끝날 때 자동으로 일드 뒤를 실행합니다.
아까 선언해둔 시간 측정 컨텍스트 매니저에다가요. 확인을 위해서 각 위치별로 확인용 출력을 넣었습니다. 위드문으로 컨텍스트 매니저를 사용해서 어떤 순서대로 실행되는지 볼게요.
방금 설명한 대로요. 위드 시작에 선언의 일드 앞 그 다음 위드 안에 메인 중간 코드
그리고 위드문이 끝날 때 일드 뒤 이 순서대로 실행됐습니다.
이렇게 컨텍스트 매니저로요 어떤 범위에서 앞뒤 코드가 필요한 기능을 설계할 수 있습니다.
이렇게 앞뒤 코드가 필요한 상황 꽤 자주 있죠.
예를 들면 아까 예시처럼 동작시간 혹은 파일을 잠깐 썼다가 지우는 임시 파일 활용에도 컨텍스트 매니저를 쓸 수 있습니다.
혹은 딥러닝 코드에서도요 고수분들이 잘 선언해둔 컨텍스트 매니저를 사용하고 있습니다.
잠깐 그래디언트 기산을 안하는 토치점 노그레드도 있고요.
잠깐 플로팅 포인트를 다른 걸 쓰는 오토캐스트도 컨텍스트 매니저입니다.
이외에도 코드 설계에서 앞뒤 코드가 필요할 때요.
직접 컨텍스트 매니저로 설계할 줄 알면
어떻죠? 번거로운 덕지덕지 앞뒤 코드를 효율화도 하고요.
내 기터브 코드도 훨씬 고수 같아 보일 수 있을 겁니다.
감사합니다.