[Python] with λ¬Έ

with은 ν”νžˆ λ§ν•˜λŠ” λ¦¬μ†ŒμŠ€ νšλ“μ€ μ΄ˆκΈ°ν™”(RAII) νŒ¨ν„΄μ„ μ œκ³΅ν•˜λŠ” μ‹ νƒμŠ€ μš”μ†Œλ‹€.
νŠΉμ • 객체의 생성과 μ†Œλ©Έ μ‹œμ μ„ μ œμ–΄ν•΄μ„œ λ¦¬μ†ŒμŠ€μ˜ 회수λ₯Ό μžλ™ν™”ν•˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” 것이닀.

C#의 using - IDisposable λ¬Έκ³Ό λ™λ“±ν•˜λ‹€.

예λ₯Ό λ“€λ©΄, μ•„λž˜μ™€ 같이 μž„μ‹œνŒŒμΌμ„ κ΄€λ¦¬ν•˜λŠ” λ§€λ‹ˆμ € 객체λ₯Ό λ§Œλ“œλŠ” 경우λ₯Ό 생각해볼 수 μžˆκ² λ‹€.

νŒŒμΌλ§€λ‹ˆμ €λ₯Ό μ‚¬μš©μ€‘μΌλ•ŒλŠ” νŒŒμΌμŠ€νŠΈλ¦Όμ„ μ—΄μ–΄λ‘”μ±„λ‘œ μ‚¬μš©ν•΄μ•Ό ν•˜κ³ , μ‚¬μš©μ΄ λλ‚œ μ΄ν›„μ—λŠ” μŠ€νŠΈλ¦Όμ„ λ‹«μ•„μ„œ λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. 또 ν•„μš”μ— λ”°λΌμ„œλŠ” λ‹€ μ“΄ μž„μ‹œνŒŒμΌμ„ λ°”λ‘œ μ‚­μ œν•˜λ„λ‘ ν•  μˆ˜λ„ μžˆκ² λ‹€.

κ·Έλž˜μ„œ with문은 μ•„λž˜μ™€ 같은 ꡬ쑰λ₯Ό λ”°λ₯Έλ‹€.
**with 원본객체 as 할당객체
** ...

μ•„λž˜λŠ” 그에 λŒ€ν•œ μ‚¬μš©λ‘€λ‹€.

with as둜 fileμ΄λΌλŠ” 이름에 λ³€μˆ˜λ₯Ό λ°”μΈλ”©ν•˜λŠ” μ‹œμ„¬μ—μ„œ with문이 μ‹œμž‘λ˜κ³ , with 문이 λλ‚˜λ©΄ μžλ™μœΌλ‘œ λ¦¬μ†ŒμŠ€λ₯Ό μ •λ¦¬ν•œλ‹€.

그럼 μ € νƒ€μž…μ„ μ–΄λ–»κ²Œ λ§Œλ“€κΉŒ?




with κ°€λŠ₯ νƒ€μž… μ •μ˜ν•˜κΈ°

with은 __enter__와 __exit__λΌλŠ” λ§€μ§λ©”μ„œλ“œλ₯Ό 톡해 μ •μ˜λœλ‹€.
asλ₯Ό κ±°λŠ” μ‹œμ μ—μ„œλŠ” __enter__κ°€ ν˜ΈμΆœλΌμ„œ 바인딩할 값을 λ°˜ν™˜ν•΄μ£Όκ³ , with μ’…λ£Œμ‹œ __exit__κ°€ ν˜ΈμΆœλΌμ„œ μžμ›μ„ 정리해쀀닀.

μ•„λž˜λŠ” 그에 λŒ€ν•œ μ˜ˆμ‹œ μ½”λ“œλ‹€.

전체 ν…ŒμŠ€νŠΈμ½”λ“œ

from random import randint
from io import TextIOWrapper

class TempFileManager:
    filename: str
    file_stream: TextIOWrapper

    def append(self, text: str)->'TempFileManager':
        self.file_stream.write(text)

    def __init__(self): 
        self.filename = str(randint(0, 1000000))      
        pass

    def __enter__(self):
        print("File created: " + self.filename)
        self.file_stream = open(self.filename, "a")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file_stream.close()
        print("File closed: " + self.filename)
        pass

<br>

def main(): 
    with TempFileManager() as file: # with μ‹œμž‘μ‹œ __enter__ 호좜
        file.append("Hello")
        file.append("World")
        file.append("!")
    # with μ’…λ£Œμ‹œ __exit__ 호좜

    pass

main()