여니의 Side Project/인프런 - 리프 (파이썬 고급)

[인프런 리프 대학생 2기] 2주차 미션활동 | Context Manager Annotation

여니's 2021. 3. 15. 12:06

2주차 미션활동은

section2를 공부하고 포스팅을 하는 거에요!

 

하루에 강의 1개 분량이 약 20분정도니까,

하루면 금방 끝나겠네! 했는데,,

강의 듣고나서

모르는 부분들에 대해 추가 조사를 하다보니까

1개 듣는 것도 버거워요,, ㅠㅠ

모르는 내용이 끝없이 나오더라구요

 

그래서 학교 수업이 있는 날 제외하고는

꾸준하게 강의 1개 이상 들어보려고 합니다 :0

 

context manager는

일반적으로 파일을 잠그거나 해제하거나, 열려있는 파일들을 닫을 때

주로 사용한다.

최소한 context manager는 __enter__와 __exit__메소드를 가지고 있다.


 


Contextlib

: with문 컨텍스트를 위한 유틸리티

 

@contextlib.contextmanager

> 이 함수는 클래스나 별도의 __enter__()와 __exit__() 메서드 작성이 필요 없이,

with문 컨텍스트 관리자를 위한 팩토리 함수를 정의하는 데

사용할 수 있는 데코레이터이다.

 

>> 제너레이터, 데코레이터를 활용해서

컨텍스트 매니저를 좀 더 직관적이고 쉽게 향상시킬 수 있다.

 


* 데코레이터 (decorator)

: 보통 @wrapper 문법을 사용한 함수 변환으로 적용되고, 

다른 함수를 돌려주는 함수이다..?

다른 함수를 돌려준다니.. 함수를 반환한다는 말일까?

 

>> 함수를 받아 명령을 추가한 뒤에

이를 다시 함수의 형태로 반환하는 함수이다.


데코레이터를 언제 사용할까?

함수의 내부를 수정하지 않고, 기능에 변화를 주고 싶을 때 주로 사용한다.

 

예를 들자면,

def main_func() 함수에는

"hello world"를 출력하는 구문이 있다.

 

그런데 나는 hello world 앞에 현재 시간이 나오도록 설정하고 싶다.

 

그러면 이 경우에는,

main_func에

print(datetime.datetime.now())를 입력하면 된다.

 

그러나 함수가 여러개라면?

def main_func1()

def main_func2()

....

 

일일이 다 여기에 시간 출력 구문을 입력하면,

코드의 가독성도 떨어질 것이고 소스의 양도 많아진다.

그럴 때 데코레이터를 사용하는 것이다!

 

def nowtime_decorator(func):
	def decorated():
		print(datetime.datetime.now())
	return decorated

@nowtime_decorator
def main_func1:
	print('hello world_1')
'''
main_func1=nowtime_decorator(main_func1)이랑 같은 의미
nowtime_decorator라는 함수가 main_func1 함수를 꾸며서 새로운 함수를 만들어낸 것이다.
'''

@nowtime_decorator
def main_func2:
	print('hello world_2')

 즉,

기존 함수에다가

내용을 덧붙이는? 그런 개념이다.

언제든 변경될 수 있는 내용이라

기존 함수를 바꾸기엔 적절치 않다고 판단될 때

데코레이터를 사용한다.

 

 

 

※ 데코레이터 주의사항

: 데코레이터는

작업의 앞 뒤에 추가적인 작업을 사용하도록 도와주는 역할이다.

함수 중간에 끼어들 수 없다.

 

 

* 데코레이터 구조

https://medium.com/@hckcksrl/python-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-decorator-980fe8ca5276


yield문

 

: 제너레이터 함수나 비동기 제너레이터 함수를 정의할 때 사용한다.

그래서 함수 정의의 바디안에서만 사용할 수 있다.

 

함수의 바디에서 yield를 사용하는 것은

함수를 제너레이터로 만들고,

 

yield 값 

 

비동기 함수 바디에서 사용하는 것은

코루틴 함수를 비동기 제너레이터로 만든다.

https://docs.python.org/ko/3/reference/expressions.html#yieldexpr


Generator

Generator는 iterator를 생성해주는 함수이다.

제너레이터는 함수 안에서 yield라는 키워드만 사용하면 끝!

이터레이터보다 훨씬 간단하게 작성할 수 있다.

 

이터레이터는 __next__ 메서드 안에서 직접 return으로 값을 반환하지만,

제너레이터는 yield에 지정한 값이 __next__메서드의 반환값으로 나온다.

 

이터레이터는 raise로 stopIteration 예외를 직접 발생시켰지만,

제너레이터는 자동으로 발생한다.

 

제너레이터 객체에서 __next__ 메서드를 호출할 때 마다

함수 안의 yield까지 코드를 실행하며

yield에서 값을 발생시킨다. 

 

[generate 사전적 의미]

: 일으키다

 


docs.python.org/ko/3/library/contextlib.html

 

contextlib — with 문 컨텍스트를 위한 유틸리티 — Python 3.9.2 문서

대부분의 컨텍스트 관리자는 with 문에서 한 번만 효과적으로 사용할 수 있다는 것을 의미하는 방식으로 작성됩니다. 이러한 일회용 컨텍스트 관리자는 사용될 때마다 새로 만들어야 합니다 - 두

docs.python.org


강의 명 : 

모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포

 

강의 링크 

www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B3%A0%EA%B8%89/dashboard

 

모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original) - 인프런 | 강

폭넓은 파이썬 개발 경험, 온오프라인 수업 경험을 바탕으로 파이썬 메타프로그래밍, 깊이있는 문법을 다루기 위한 과정입니다. 더 나아가 파이썬 취준생 면접 및 경력자분들의 기술면접에도

www.inflearn.com