๐ [Python] With ๋ช ๋ น์ด ์ดํดํ๊ธฐ
on
๐๐ปโโ๏ธ ๋ค์ด๊ฐ๋ฉฐ
with
๋ช
๋ น์ด๋ Python์ ์ฌ์ฉํ ๋ ์ดํดํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ ์ค์ ํ๋์
๋๋ค. ํ์ง๋ง, ์ด๋ฅผ ์ดํดํ๊ณ ๋๋ฉด Python์ ๋งค์ง๊ฐ์ ๊ธฐ๋ฅ ์ค์ ํ๋ ์ธ ๊ฑธ ์๊ฒ ๋ ๊ฒ๋๋ค. ๊ฒ๋ค๊ฐ, Python ์ฝ๋๊ฐ ๋ ๊น๋ํด์ง๊ณ ์ฝ๊ธฐ ์ฌ์ ์ง๋๋ค.
with
๋ช
๋ น์ด์ ๊ฐ์ฅ ํฐ ํน์ง์ ์ฌ์ฌ์ฉ๋๋ ๋ถ๋ถ์ ์ค์ฌ์ฃผ๋ ๊ธฐ๋ฅ์
๋๋ค. ๋ค์ ์์ ๋ฅผ ๋ณด๋ฉด ์ดํด๊ฐ ์ข ๋ ์ฌ์ธ ๊ฒ๋๋ค.
๐ค ์์
with
๋ช
๋ น์ด์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์์ ์ค open
ํจ์๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ฐพ์ ๋ถ ์ ์์ต๋๋ค.
with open('hello.txt', 'w') as f:
f.write('hello, world!')
ํ์ผ์ ์ฝ๊ณ ์ฐ๋ ๊ณผ์ ์ PC ์ ์ฅ์์ ๊ต์ฅํ ์ค๋ํ ์ผ ์ค์ ํ๋์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์ผ์ ์ฝ๊ณ ์ธ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ(File discriptor)๋ ์น๊ตฌ๋ฅผ ๋ถ๋ฌ์ค๊ณ ๋ซ์ ์ค์ผ ํด์. ๋ค์๊ณผ ๊ฐ์ด ๋ง์ด์ฃ .
f = open('hello.txt', 'w')
try:
f.write('hello, world')
finally:
f.close()
ํ์ผ์ ์ฐ๊ธฐ ํน์ ๋ถ๋ฌ์ค๊ธฐ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผํ๊ณ ํ์ผ์ ๋ถ๋ฌ์์ ์์ ์ด ๋๋๋ฉด ํญ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ์์ค์ผ ํด์. ํ์ง๋ง, ์ด๋ฌํ ์ฝ๋๋ ๊ฝค๋ ๋ณต์กํ๊ธฐ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๊ธฐ๋ ํด์.
f = open('hello.txt', 'w')
f.write('hello, world')
f.close()
์ด์ ์ข ๋ ์ต์ํ ํ์ผ ์ฝ๊ธฐ ์ฐ๊ธฐ์ฃ ? ํ์ง๋ง ์ด๋ฐ ์ฝ๋๋ f.close()
์ด์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํด์ ์ฝ๋๊ฐ ์คํ๋์ง ์์ผ๋ฉด ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ฉ๋ก๋ฆฌ์ ๋จ๊ฒ ๋๋ ์น๋ช
์ ์ธ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ด์. ๊ทธ๋์ with
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ด๋ฐ ๋ฐ๋ณต๋ ๊ณผ์ ์ ์ค์ฌ ์ค ์ ์์ด์. with
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฏ๋ก์จ, ๋ฒ๊ทธ๋ ์ค์ฌ์ฃผ๊ณ ํจ์จ์ ์ธ ์ฝ๋๊ฐ ๋๋ ๊ฒ์ด์ฃ .
๐ค ํด๋์ค ๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉํ๊ธฐ
with
์ ๋ค์ ๊ธฐ๋ฅ์ผ๋ก context managers ๋ผ๋ ๊ธฐ๋ฅ์ ์ดํด ๋ณด์์. context manger์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์์.
Whatโs a context manager? Itโs a simple โprotocolโ (or interface) that your object needs to follow in order to support the with statement.
์ผ๋ฐ์ ์ผ๋ก, ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ __enter__
ํน์ __exit__
์ ๊ฐ์ ๋ฉ์๋์ ๊ฐ์ ์น๊ตฌ๋ค์ Context manager๋ผ๊ณ ๋ถ๋ฌ์. ์ด์ ์์ ๋ฅผ ํตํด ์ฝ๊ฒ ์ดํด ํด๋ณด์์.
class ManagedFile:
def __init__(self, name):
self.name = name
def __enter__(self):
self.file = open(self.name, 'w')
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
if self.file:
self.file.close()
์์ ๊ฐ์ด ํด๋์ค๋ฅผ ์ ์ธํ๊ณ ๊ฐ ๋ฉ์๋๋ค์ ๊ท์น๋ฅผ ๋ฐ๋ฅด๋ Protocol์ ๋ง๋ค ์ ์์ด์. ํ์ผ์ ์ฝ๊ณ ์ธ๋ ์ด๋ฐ ํ๋กํ ์ฝ์ ์ ์ ํด๋๋ฉด ๋ฐ๋ณต์ ์ธ ์ฝ๋์ ์ค๋ฅ ์์ด ๊ฐ๋จํ๊ฒ ํ์ผ์ ๋ถ๋ฌ ์ฌ ์์์ด์. ์ง๊ธ ์ด ์ญํ์ with
๋ช
๋ น์ด๊ฐ ๋์ ํ๋ ๊ฒ์ด์์.
์์ฝ
with
๋ช ๋ น์ด์ ์ด๋ฅธ๋ฐ ์ปจํ ์คํธ ๊ด๋ฆฌ์(context managers)์์ try/finally ๋ฌธ์ฅ์ ์ฌ์ฉ์ ์บก์ํํจ์ผ๋ก์จ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋จ์ํํ๋ค.with
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฆฌ์์ค ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ฝ์ ์ ์์ต๋๋ค.