๐Ÿ [Python] With ๋ช…๋ น์–ด ์ดํ•ดํ•˜๊ธฐ

์Šน์ค€ยท2021๋…„ 4์›” 11์ผ
0

๐Ÿ’๐Ÿปโ€โ™‚๏ธ ๋“ค์–ด๊ฐ€๋ฉฐ

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 ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
profile
๋‚ด์ผ์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ ์˜ค๋Š˜์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค ๐Ÿค—

0๊ฐœ์˜ ๋Œ“๊ธ€