python/응용

yield 활용 1

wefree 2023. 11. 15. 11:14

개선 전

f = open("my_config.ini")

for line in f:
    line = line.strip()
    if line.startswith('#'):
        # A comment line, skip it
        continue
    if not line:
        # A blank line, skip it
        continue
    
    do_something(line)

 

 

개선 후

f = open("my_config.ini")

def interesting_lines(f):
    for line in f:
        line = line.strip()
        if line.startswith('#'):
            continue
        if not line:
            continue
        yield line
    
with open("my_config.ini") as f:
    for line in interesting_lines(f):
        do_something(line)

 

설명

  • 개선전 코드는 한블럭에서 두가지 동작을 한다. (데이터 필터링 + do_something)
  • 개선후 코드에서는
    • 위의 두가지 동작을 분리한다.
    • yield 로 lazy 하게 동작하도록 한다.
    • python duck type 덕분에 파라미터로 꼭 파일이 아니라 string 을 넘겨 interesting_lines() 를 테스트 해 볼 수 있다.

 

참고: https://youtu.be/EnSu9hHGq5o?si=iYPFtfwnNl3JVc33