Python

GreenBeanΒ·2022λ…„ 2μ›” 11일
0
post-thumbnail

Python

With

with EXPRESSION [as VARIABLE]:
	BLOCK
  • 보톡 ν”„λ‘œκ·Έλž¨μ€ νŒŒμΌμ— μ ‘κ·Όν•΄μ„œ 파일 λ‚΄μš© 등을 읽고 μ“°κ³  μ‚­μ œν•˜κ³  μˆ˜μ •ν•˜λŠ” λ“±λ“± λ¬΄μ–Έκ°€μ˜ 일을 μˆ˜ν–‰ν•œ λ’€ κ·Έ νŒŒμΌμ„ ν•΄μ œ(close) ν•˜λŠ” νŒ¨ν„΄μ„ 따름
    • 예λ₯Ό λ“€μ–΄ μš°λ¦¬κ°€ μ—‘μ…€ νŒŒμΌμ„ μ—΄μ—ˆλŠ”λ° κ·Έ μ—‘μ…€ νŒŒμΌμ„ μ—΄κ³  μžˆλŠ” λ™μ•ˆμ—λŠ” λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ μ—‘μ…€ νŒŒμΌμ— μ ‘κ·Όν•  수 μ—†κ²Œ 됨
    • κ±°λ‘μ ˆλ―Έν•˜κ³  νŒŒμΌμ„ μ—΄μ—ˆμœΌλ©΄ λ‹«μ•„μ£ΌλŠ” 일을 빼먹지 말아야 ν•œλ‹€λŠ” 것
  • 보톡은 close() λ“±κ³Ό 같은 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ μ—¬κΈ°μ—λŠ” μˆ¨μ€ 문제점이 있음
    • 파일 처리λ₯Ό μˆ˜ν–‰ν•˜λŠ” 도쀑에 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ 되면 close() 문을 μ‹€ν–‰ν•  수 μ—†κ³  κ·Έλ ‡κ²Œ 되면 이 νŒŒμΌμ€ μ˜μ›νžˆ 닫을 μˆ˜κ°€ μ—†κ²Œ 됨
    • with문은 κ·Έ ꡬ문을 μ‹€ν–‰ν–ˆμ„ λ•Œ 였λ₯˜κ°€ λ°œμƒν•˜λ“  μ•ˆν•˜λ“  λ§ˆμ§€λ§‰μ— close λ₯Ό 해주도둝 ν•˜λŠ” 것
  • νŒŒμ΄μ¬μ„ ν™œμš©ν•˜λ‹€λ³΄λ©΄ νŒŒμΌμ„ μ—΄κ³  μˆ˜μ •ν•œ ν›„, λ‹«λŠ” ν˜•νƒœμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 많음
    • 보톡은 객체의 .Quit()λΌλ˜κ°€ .Close()와 같은 ν•¨μˆ˜λ₯Ό 톡해 직접 νŒŒμΌμ„ λ‹«μŒ
    • λ§Œμ•½, 객체λ₯Ό λ‹«λŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ–΄λ„ 계속 ν•΄λ‹Ή 객체가 μ—΄λ €μžˆμ–΄ λ©”λͺ¨λ¦¬λ₯Ό μ μœ ν•˜κ³  있게 λ˜λ―€λ‘œ λ©”λͺ¨λ¦¬λ₯Ό λΆˆν•„μš”ν•˜κ²Œ λ‚­λΉ„ν•˜κ²Œ λ˜λŠ” 것
  • κ·Έλž˜μ„œ νŒŒμ΄μ¬μ—μ„œλŠ” with ~ as ~ λΌλŠ” ꡬ문을 제곡
    • κ°œλ°œμžκ°€ μ‹€μˆ˜λ‘œ close() λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ with ~ as ~ ꡬ문이 λλ‚˜λ©΄ μžλ™μœΌλ‘œ 객체λ₯Ό close ν•˜κ²Œ ν•΄μ€Œ

Tip! μΆ”κ°€ λ‚΄μš©

  • μžμ›μ„ νšλ“ν•˜κ³  μ‚¬μš© ν›„ λ°˜λ‚©ν•΄μ•Ό ν•˜λŠ” 경우 주둜 μ‚¬μš©
    • μžμ›μ„ νšλ“
    • μžμ›μ„ μ‚¬μš©
    • μžμ›μ„ λ°˜λ‚©
  • 예λ₯Ό λ“€μ–΄ νŒŒμΌμ„ μ—΄κ³  μ‚¬μš©ν–ˆλ‹€λ©΄ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μœ„ν•΄ λ‹«κ³  λ°˜λ‚©ν•΄μ•Ό 함
    • λ°μ΄ν„°λ² μ΄μŠ€ μ„Έμ…˜μ„ μ–»μ–΄ μ‚¬μš©ν–ˆλ‹€λ©΄ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μœ„ν•΄ λ°˜λ‚©ν•΄μ•Ό 함
    • μžμ›μ€ ν•œμ •λ˜μ–΄ 있기 λ•Œλ¬Έμ— 적절히 νšλ“κ³Ό λ°˜λ‚©ν•΄μ•Ό 함

λ™μž‘ 방식

  • νŒŒμ΄μ¬μ€ νŠΉμˆ˜λ©”μ†Œλ“œλ₯Ό μ‚¬μš©
    • 클래슀λ₯Ό μ•Œκ³  μžˆλ‹€λ©΄ μ΄ν•΄ν•˜κΈ° μ‰¬μšΈ 것이고 λͺ¨λ₯΄λ©΄ 이 뢀뢄은 λ„˜μ–΄κ°€λ„ μƒκ΄€μ—†μŒ
    • __enter__ 와 __exit__ νŠΉμˆ˜λ©”μ†Œλ“œλ₯Ό 가진 객체에 with 문을 μ“Έ 수 μžˆλŠ” 것
    • with λ¬Έ λ‚΄ ν‘œν˜„μ‹μ€ ν•œ 객체둜 평가됨
      • μ΄μ–΄μ„œ 이 객체의 __enter__ λ©”μ„œλ“œκ°€ 호좜되고 끝으둜 호좜 κ²°κ³Όκ°€ λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” 것
      • 블둝을 λͺ¨λ‘ μ‹€ν–‰ν•˜λ©΄ λΈ”λ‘μ—μ„œ 였λ₯˜κ°€ λ°œμƒν–ˆλ”λΌλ„ νŒŒμ΄μ¬μ€ κ·Έ 객체에 __exit__λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ²Œ 됨
      • 파일 객체의 __exit__ λ©”μ†Œλ“œλŠ” νŒŒμΌμ„ λ‹«μŒ
# μ˜ˆμ‹œ μ½”λ“œ
class Hello:
    def __enter__(self):
        # μ‚¬μš©ν•  μžμ›μ„ κ°€μ Έμ˜€κ±°λ‚˜ 생성
        print('enter...')
        return self # λ°˜ν™˜κ°’μ΄ μžˆμ–΄μ•Ό VARIABLE을 블둝 λ‚΄μ—μ„œ μ‚¬μš©ν•  수 있음
        
    def sayHello(self, name):
        # μžμ›μ„ μ‚¬μš©
        print('hello ' + name)

    def __exit__(self, exc_type, exc_val, exc_tb):
        # λ§ˆμ§€λ§‰ 처리 (μžμ› λ°˜λ‚© λ“±)
        print('exit...')

with Hello() as h:
    h.sayHello('hwaya')
    h.sayHello('hwaya2828')


# κ²°κ³Ό
enter...
hello hwaya
hello hwaya2828
exit...
  • 클래슀의 객체λ₯Ό λ°”λ‘œ λ§Œλ“€κ³  λ§Œλ“  객체λ₯Ό μ΄μš©ν•˜μ—¬ 인사λ₯Ό ν•˜κ³  λ§Œλ“  객체λ₯Ό μ†Œλ©Έμ‹œν‚΄
  • 객체의 라이프사이클(생성 >> μ‚¬μš© >> μ†Œλ©Έ)을 섀계할 수 있음
    • ν•„μš” μ΄μƒμœΌλ‘œ 였래 λ“€κ³  μžˆκ±°λ‚˜ μ—¬κΈ°μ €κΈ° λ„˜κΈ°λ©΄μ„œ λΆˆν•„μš”ν•œ κ°μ²΄μ—κ²Œ λ„˜κ²¨μ„œλŠ” μ•ˆλ¨
    • 각 객체듀은 단일 μ±…μž„μ„ 지고 μ„€κ³„λœ 라이프사이클에 따라 움직여야 μ’‹μŒ

Tip! μΆ”κ°€ μ˜ˆμ‹œ

with open('textfile.txt', 'r') as file:
    contents = file.read()

# μœ„ ꡬ문과 λ™μΌν•œ λ‚΄μš©
file = open('textfile.txt', 'r')
contents = file.read()
file.close()
  • λ‘λ²ˆμ§Έ μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€κ³  ν•  λ•Œ λ§Œμ•½μ— content = file.read() μ—μ„œ μ—λŸ¬κ°€ λ‚œλ‹€λ©΄ file을 닫을 수 μ—†μŒ
    • κ·ΈλŸ¬λ‚˜ with 문을 μ‚¬μš©ν•˜λ©΄ μ—λŸ¬κ°€ λ‚˜λ”λΌλ„ file을 μžλ™μœΌλ‘œ λ‹«μ•„μ€Œ

Tip! μΆ”κ°€ μ˜ˆμ‹œ

# μ˜ˆμ‹œ μ½”λ“œ
class Withtest: 
    # μ΄ˆκΈ°ν™” λ©”μ„œλ“œ μ •μ˜ 
    def __init__(self): 
        self.temp = "μ΄ˆκΈ°ν™” λ©”μ„œλ“œ" 
   
    # 객체가 호좜될 λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰ 
    def __enter__(self): 
        print(self.temp) 
        return self # λ°˜ν™˜κ°’μ΄ μžˆμ–΄μ•Ό VARIABLE을 λΈ”λ‘λ‚΄μ—μ„œ μ‚¬μš©ν•  수 있음
   
    def printText(self): 
        print("λ©”μ†Œλ“œ 호좜 ν…ŒμŠ€νŠΈ") 
   
    # with ꡬ문 톡해 객체가 μ’…λ£Œλ  λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰ 
    def __exit__(self, exc_type, exc_val, exc_tb): 
        # μ’…λ£Œ ꡬ문 μ„€μ • (μ„Έμ…˜μ˜ μ’…λ£Œ λ“±) 
        print('with 톡해 μ’…λ£Œ') 
   
    # 객체 생성 및 with ꡬ문 μ‹€ν–‰ 
    if __name__ == "__main__": 
        withclass = Withtest() 
   
    with withclass as wc: 
        wc.printText()


# κ²°κ³Ό
μ΄ˆκΈ°ν™” λ©”μ„œλ“œ
λ©”μ†Œλ“œ 호좜 ν…ŒμŠ€νŠΈ
with 톡해 μ’…λ£Œ
  • μœ„ μ½”λ“œλ₯Ό 확인해보면 μ‹€ν–‰λΆ€μ—μ„œ withclassλΌλŠ” 클래슀 객체λ₯Ό μƒμ„±ν–ˆκ³  μ•„λž˜ with 문을 톡해 printText( ) λ©”μ†Œλ“œλ₯Ό 호좜
    • with ꡬ문을 톡해 μ‹€ν–‰ν•˜λ‹ˆ __enter__( ) λ©”μ†Œλ“œμ™€ __exit__( ) λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœ 것을 확인할 수 있음
    • 참고둜 __exit__( ) λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜μΈ exc_type, exc_val, exc_tbλŠ” with 문을 λΉ μ Έλ‚˜μ˜€κΈ° 이전에 μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 정보
  • μœ„μ™€ 같은 μ½”λ”© 방식은 Python Context Managers 방식 μ€‘μ˜ ν•˜λ‚˜
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 λŒ“κΈ€