๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ ๊ถ๊ธˆํ•ด์ง„ ๊ฒƒ๋“ค

[python] with ๋ฌธ๋ฒ•

1eehyunji 2023. 8. 20. 23:35

์˜ฌํ•ด ์ƒ๋ฐ˜๊ธฐ์— ์šด์ด ์ข‹๊ฒŒ๋„ IT ๋Œ€๊ธฐ์—…์˜ ๋ฉด์ ‘์„ ๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ๋‹ค. 

๊ทธ๋•Œ ๋ฐ›์•˜๋˜ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ค‘์— "python์˜ with ๋ฌธ๋ฒ• ์‚ฌ์šฉํ•ด๋ดค์–ด์š”?"๊ฐ€ ์žˆ์—ˆ๋‹ค.

์‚ฌ์‹ค ํŒŒ์ด์ฌ์€ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„๋ฅผ ์œ„ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋‚˜ Django๋กœ API๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ, ์ธ๊ณต์ง€๋Šฅ ๋ชจ๋ธ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋“ฑ ํ•„์š”์— ๋”ฐ๋ผ

๊ทธ๋•Œ ๊ทธ๋•Œ ํ•„์š”ํ•œ ๋ฌธ๋ฒ•์„ ์ฐพ์œผ๋ฉฐ ์‚ฌ์šฉํ–ˆ์—ˆ๊ณ , ํŒŒ์ด์ฌ์ด๋ผ๋Š” ์–ธ์–ด ์ž์ฒด์— ๋Œ€ํ•œ ํ•™์Šต์€ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— with ๋ฌธ๋ฒ•์€ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•ด๋ณผ ๊ธฐํšŒ๊ฐ€ ์—†์—ˆ๋˜ ์ฒ˜์Œ ๋“ฃ๋Š” ๋ฌธ๋ฒ•์ด๋ผ ๋‹นํ™ฉํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค.

๋‹น์—ฐํžˆ "์‚ฌ์šฉํ•ด๋ณธ ์  ์—†์Šต๋‹ˆ๋‹ค. ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.."๋ผ๊ณ  ๋‹ต๋ณ€ํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹คใ… ใ… 

 

๊ทธ๋ž˜์„œ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค!

 

with

์ž์›์„ ํš๋“ํ•˜๊ณ , ์‚ฌ์šฉํ•˜๊ณ , ๋ฐ˜๋‚ฉํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ์„ ์—ด๊ณ (ํš๋“), ํŒŒ์ผ์„ ์ฝ๊ณ (์‚ฌ์šฉ), ํŒŒ์ผ์„ ๋‹ซ๋Š”(๋ฐ˜๋‚ฉ) ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

์œ„ ์˜ˆ์‹œ๋ฅผ with ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์™€ with ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

with ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

# ์ž์›์˜ ํš๋“
f = open("my_text_file.txt", "r")

# ์ž์›์˜ ์‚ฌ์šฉ
text = f.read()
print(text)

# ์ž์›์˜ ๋ฐ˜๋‚ฉ
f.close()

with ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

with open("my_text_file.txt", "r") as f:
    text = f.read()
    print(text)

์ด๋ ‡๊ฒŒ with ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด, open()์„ ํ†ตํ•ด์„œ ์—ด์–ด๋‘” ํŒŒ์ผ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด์„œ read() ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์„ ์ฝ๊ณ , ์ถœ๋ ฅํ•˜๋Š” with ๊ตฌ๋ฌธ์ด ๋๋‚˜๋ฉด close()๋ฅผ ๋”ฐ๋กœ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ํŒŒ์ผ ์ŠคํŠธ๋ฆผ์„ ๋‹ซ์•„์ค€๋‹ค.

 

context manager

์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €๋Š” with ๊ตฌ๋ฌธ์— ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…์ด๋ฉฐ, ์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €๋Š” ๋‹ค์Œ ๋‘ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.

  • __enter__(self) : with ๋ฌธ์— ์ง„์ž…ํ•˜๋Š” ์‹œ์ ์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ
  • __exit__(self, type, value, traceback) : with ๋ฌธ์ด ๋๋‚˜๊ธฐ ์ง์ „์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ

__exit__() ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ›๋Š” ์„ธ ๊ฐœ์˜ ์ธ์ž๋Š” ํ•ด๋‹น ๊ฐ์ฒด์™€ ์—ฐ๊ด€๋œ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋˜์—ˆ์„๋•Œ, ํ•ด๋‹น ์˜ˆ์™ธ์— ๊ด€ํ•œ ์ •๋ณด์ด๋‹ค. ์˜ˆ์™ธ์—†์ด with ๊ตฌ๋ฌธ์ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ์ด ์„ธ ์ธ์ž๋Š” ๋ชจ๋‘ None์ด ๋  ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €์™€ with ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

class PrintNumber:
    # ์‚ฌ์šฉํ•  ์ž์› ์ƒ์„ฑ ๋ฐ ํš๋“.
    def __enter__(self):
        print("start.")
        return self

    # ์ž์› ์‚ฌ์šฉ.
    def print_number(self, num):
        print(f"Number: {num}")

    # ์ž์› ๋ฐ˜๋‚ฉ ๋ฐ ํ›„์ฒ˜๋ฆฌ.
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("end.")

with PrintNumber() as pn:
    pn.print_number(42)
    pn.print_number(10)
    
# start.
# 42
# 10
# end.

์œ„ ์˜ˆ์‹œ์™€ ๊ฐ™์ด with๊ตฌ๋ฌธ์ด ์‹œ์ž‘๋  ๋•Œ __enter__()๋ฅผ ๊ฑฐ์นœ ํ›„์—, ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” print_number()๋ฅผ ๊ฑฐ์น˜๊ณ , with ๊ตฌ๋ฌธ์ด ๋๋‚˜๊ธฐ ์ง์ „์—” __exit__()๋ฅผ ์‹คํ–‰ํ•˜๊ณ  with ๊ตฌ๋ฌธ์ด ์ข…๋ฃŒ๋œ๋‹ค.