๐Ÿฅ Python 05. ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€

matisseยท2020๋…„ 3์›” 28์ผ
0

Python Basic

๋ชฉ๋ก ๋ณด๊ธฐ
6/6

ํŒŒ์ด์ฌ์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

1. module

๋ชจ๋“ˆ์€ ๊ฐ์ฒด(๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ)์„ ๋ชจ์•„๋†“์€ ํŒŒ์ผ์ด๋‹ค. ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„์–ด ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•  ๋•Œ len() ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ํŒŒ์ด์ฌ์—์„œ ๋ชจ๋“ˆ๋กœ ์ด๋ฏธ ๊ตฌํ˜„ํ•ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

1.1 ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

ํŒŒ์ด์ฌ์€ ํŒŒ์ผ ์ด๋ฆ„ > ๋ชจ๋“ˆ ์ด๋ฆ„ ์ˆœ์œผ๋กœ ๋‚ด์šฉ์„ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์—, ๋จผ์ € ํŒŒ์ผ ์ด๋ฆ„์„ ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ "name space" ๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฆ„์˜ ๊ณต๊ฐ„ ํ˜น์€ ์˜์—ญ์„ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

import module_name
module_name.module_function # ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•˜๋Š” ๋ณ€์ˆ˜/ํ•จ์ˆ˜/ํด๋ž˜์Šค ์ด๋ฆ„

from module_name import mu_func, my_var, my_class 

from ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“ˆ ๋‚ด์— ์›ํ•˜๋Š” ํ•จ์ˆ˜, ํด๋ž˜์Šค๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ„ ๋ชจ์–‘(all)์œผ๋กœ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ถ€๋ฅผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, local scope์˜ ๊ฐ์ฒด์™€ ์ด๋ฆ„ ์ถฉ๋Œ์ด ๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. (?)


from my_module import my_module_func, my_module_var

print(my_module_var)
my_module_func()
from my_module import* # *์€ ๋ชจ๋“  ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

print(my_module_var)
my_module_func()

๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜จ ๋’ค ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ๋ชจ๋“ˆ์ด๋ฆ„.ํ•จ์ˆ˜ ๋กœ ๋ถˆ๋Ÿฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์ด ๊ธธ๋ฉด ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์—์„œ ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅผ๊ฑด์ง€ ์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

from my_module3 import function_with_name_too_long as f3

f1()
f2()
f3()

1.2 name space

(์ฐธ๊ณ  ๋ฌธ์„œ) ํŒŒ์ด์ฌ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ํŠน๋ณ„ํ•œ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. ๊ฐ์ฒด๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  name space๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋งŒ์•ฝ ๋ฐ˜์— ์—ฌ๋Ÿฌ ๋ช…์˜ ์˜ˆ์€์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•œ ๋ช…์„ ํŠน์ •ํ•ด์„œ ์ฐพ๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ด๋‹ค.ํ•˜์ง€๋งŒ ์„ฑ์„ ๋ถ™์ด๊ฑฐ๋‚˜ ๋ณ„๋ช…์„ ๋ถ™์ด๋ฉด ํ•œ ๋ช…์œผ๋กœ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

name space๋„ ๋น„์Šทํ•œ ์›๋ฆฌ๋‹ค. ์–ด๋–ค ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, name space๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ์–ด ๊ตฌ๋ถ„์„ ํ•  ๋•Œ ์กฐ๊ธˆ์˜ ์ •๋ณด๋ฅผ ๋”์ถ”๊ฐ€ํ•˜๋Š”๊ฑฐ๋‹ค

  • name: un unique identifier
  • space: scope ๊ด€๋ จ ๋ถ€๋ถ„

2. package

module๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋…์ธ๋ฐ, ๋” ํฌ๊ณ  ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

ํŒŒ์ด์ฌ ํŒŒ์ผ๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ(directory)๊ฐ€ ํ•˜๋‚˜์˜ package๊ฐ€ ๋˜๊ณ , ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์ด package ์ด๋ฆ„์ด ๋œ๋‹ค.

2.1 ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

Package๋Š” ์ผ๋ฐ˜ ๋ชจ๋“ˆ ์ฒ˜๋Ÿผ import ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ , ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ฒ˜๋Ÿผ "dot notation" ์œผ๋กœ ์›ํ•˜๋Š” ๋ชจ๋“ˆ์„ importํ•œ๋‹ค.

import pkg.mod1 # pkg์˜ mod1์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
from pkg.mod2 import func2 #pkg mo2์˜ func2๋งŒ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

pkg.mod1.func2()
func2()

2.2 init.py

package๊ฐ€ import ๋ ๋•Œ ์ดˆ๊ธฐ ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ• ๋•Œ๊ฐ€ ์žˆ๋‹ค. ํŒŒ์ด์ฌ์€ __init__.py ํŒŒ์ผ์„ ํ†ตํ•ด package๋ฅผ ์ดˆ๊ธฐ ์„ค์ •ํ•˜๊ณ  ์ด๋ฅผ Package Initialization์ด๋ผ๊ณ  ํ•œ๋‹ค. ํŒจํ‚ค์ง€ ์•ˆ์— ํ•ด๋‹น ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด, ์ฝ”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Import ํ• ๋•Œ ๊ฒฝ๋กœ์˜ ์ด ๊ธธ์ด ์ค„์—ฌ์ฃผ๊ธฐ

ํŒจํ‚ค์ง€์˜ init ํŒŒ์ผ์—์„œ ๋จผ์ € ํ•œ๋ฒˆ import๋ฅผ ํ•ด์ฃผ๋ฉด, ๋‚ด๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  main ํŒŒ์ผ์—์„œ ๋ชจ๋“ˆ์„ ์ค‘๋ณต์œผ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

# __init__.py
from mod1 import func2

# main.py
from pkg import func2

func2()

import ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ์ œํ•œํ•˜๊ธฐ

๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ package ์™ธ๋ถ€์—์„œ import ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด __all__ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

all ๋ณ€์ˆ˜์˜ default ๊ฐ’์€ ๋ชจ๋“  ํ•จ์ˆ˜/๋ณ€์ˆ˜/ํด๋ž˜์Šค์ด๊ณ , init ํŒŒ์ผ์—์„œ ๋”ฐ๋กœ ์ •์˜ํ•ด import๋  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ œํ•œํ•œ๋‹ค. __init__์€ string ์š”์†Œ๋ฅผ ๊ฐ€์ง€๋Š” list์ด๊ณ  import๋ฅผ ์›ํ•˜๋Š” ์š”์†Œ๋ฅผ list์— ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

# __init__.py
from mod1 import func2
from mod2 import func3

__all__ = ['func2', 'func3'] # ์‚ฌ์šฉ๋  ํ•จ์ˆ˜๋ฅผ ์ œํ•œ 

# main.py
from pkg import *

func2()
func3()
func4() ## Error. func4 ํ•จ์ˆ˜๋Š” __all__ ์— ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ import ๋  ์ˆ˜ ์—†์Œ.

3. keyword 'import'

import statement๋Š” ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„๊นŒ? ํŒŒ์ด์ฌ์€ ๋‹ค์Œ 3๊ฐ€์ง€ ์žฅ์†Œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๋ฉด์„œ ์ฐพ๋Š”๋‹ค.

3.1 ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€๋ฅผ ์ฐพ๋Š” ์ˆœ์„œ

- sys.modules

ํŒŒ์ด์ฌ์ด ๋ชจ๋“ˆ์ด๋‚˜ package๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๊ณณ์ด๋‹ค. sys.modules๋Š” ๋‹จ์ˆœํ•œ dictionary๊ณ , ์ด๋ฏธ import๋œ ๋ชจ๋“ˆ๊ณผ package๋“ค์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

์ฆ‰, ํ•œ๋ฒˆ import๋œ ๋ชจ๋“ˆ๊ณผ package๋“ค์€ ํŒŒ์ด์ฌ์ด ๋˜ ๋‹ค์‹œ ์ฐพ์ง€ ์•Š์•„๋„ ๋˜๊ณ  ์ƒˆ๋กœ import ํ•˜๋Š” ๋ชจ๋“ˆ์€ sys.modules ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

- built-in modules

ํŒŒ์ด์ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŒŒ์ด์ฌ ๊ณต์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. Built-in ๋ชจ๋“ˆ๋“ค์€ ์ด๋ฏธ ํŒŒ์ด์ฌ์— ํฌํ•จ๋˜์–ด ๋‚˜์˜ค๋ฏ€๋กœ ํŒŒ์ด์ฌ์ด ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

- sys.path

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณด๋Š” ์žฅ์†Œ๊ฐ€ ๋ฐ”๋กœ sys.path์ด๋‹ค. sys.path๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ string type์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” list์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŒŒ์ด์ฌ์€ list์˜ ๊ฐ ๊ฒฝ๋กœ๋ฅผ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋ณด๋ฉฐ ํ•ด๋‹น ๊ฒฝ๋กœ์— import ํ•˜๊ณ ์ž ํ•˜๋Š” package๊ฐ€ ์œ„์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. sys.path ์—์„œ๋„ ๋ชป์ฐพ์œผ๋ฉด ModuleNotFoundError ์—๋Ÿฌ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

site packages?

built-in์ด ์•„๋‹Œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ด๋‹ค. pip ์œผ๋กœ ์„ค์น˜ํ•œ ์™ธ๋ฌด ๋ชจ๋“ˆ์€ ์ž๋™์œผ๋กœ site-packages ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์น˜๋˜๊ณ , ์ด๋Š” sys.path์— ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐพ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

3.2 ์ ˆ๋Œ€, ์ƒ๋Œ€ ๊ฒฝ๋กœ

local package๋ฅผ import ํ• ๋•Œ๋Š” ํ•ด๋‹น package์˜ ์œ„์น˜์— ๋งž๊ฒŒ import ๊ฒฝ๋กœ๋ฅผ ์ž˜ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค. Local package๋ฅผ import ํ•˜๋Š” ๊ฒฝ๋กœ์—๋Š” absolute path ์™€ relative path ๊ฐ€ ์žˆ๋‹ค.

** ๋งˆํฌ๋‹ค์šด์—์„œ ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฏ€๋กœ ํŒŒ์ผ์˜ ๊ณ„์ธต์„ ์ด๋ฏธ์ง€ํ™”ํ•˜์ง„ ์•Š์•˜๋‹ค. my_app์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋Š” ๋‘ ๊ฐœ์˜ ํŒจํ‚ค์ง€(package 1,2)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, package2๋Š” subpackage๋ผ๋Š” ์ค‘์ฒฉ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

โ””โ”€โ”€ my_app
โ”œโ”€โ”€ main.py
โ”œโ”€โ”€ package1
โ”œโ”€โ”€ module1.py
โ””โ”€โ”€ module2.py
โ””โ”€โ”€ package2
โ”œโ”€โ”€ init.py
โ”œโ”€โ”€ module3.py
โ”œโ”€โ”€ module4.py
โ””โ”€โ”€ subpackage1
โ””โ”€โ”€ module5.py

- absolute path

์ ˆ๋Œ€ ๊ฒฝ๋กœ. import๋ฅผ ํ•˜๋Š” ํŒŒ์ผ์ด๋‚˜ ๊ฒฝ๋กœ์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•˜๊ณ , ๊ฒฝ๋กœ๋“ค์˜ ์‹œ์ž‘์ ์ด ์ „๋ถ€ "my_app" ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋‹ค. (์ด๋ฏธ my_app ํ”„๋กœ์ ํŠธ ์•ˆ์— ์žˆ์œผ๋ฏ€๋กœ my_app์€ ์ƒ๋žต)

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

์ฐธ๊ณ ๋กœ current directory ๋ผ๊ณ  ํ•˜๋Š” ํ˜„์žฌ์˜ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋Š” default๋กœ sys.path ์— ํฌํ•จ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ absolute path๋Š” current directory ๋กœ ๋ถ€ํ„ฐ ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

- relative path

๋ฐ˜๋ฉด Relative path ๋Š” import ํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ local package ์•ˆ์—์„œ ๋‹ค๋ฅธ local package๋ฅผ import ํ• ๋•Œ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ํŒŒ์ผ์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์žฌ์ •์˜ํ•ด์•ผํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์–ด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ๊ถŒ์žฅ๋˜๊ธด ํ•œ๋‹ค.

package2์˜ module3์—์„œ package2์˜ class1๊ณผ package2์˜ ํ•˜์œ„ package์ธ subpackage1์˜ module5์˜ function2 ํ•จ์ˆ˜๋ฅผ importํ•ด๋ณด์ž.

# package2/module3.py
from . import class1
from .subpackage1.module5 import function2

# subpackage1/module5.py
from ..module4 import class4
  • dot(.): import๊ฐ€ ์„ ์–ธ๋˜๋Š” ํŒŒ์ผ์˜ ํ˜„์žฌ ์œ„์น˜. ํ˜„์žฌ ์œ„์น˜๋Š” package2/module3.py ์ด๋ฏ€๋กœ ํ˜„์žฌ ์œ„์น˜์—์„œ๋ถ€ํ„ฐ ์›ํ•˜๋Š” ๋ชจ๋“ˆ์˜ ๊ฒฝ๋กœ๋งŒ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • dot 2๊ฐœ(..) ๋Š” ํ˜„์žฌ์œ„์น˜์—์„œ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋‹ค.

4. ๊ณผ์ œ

4.1 sys.modules ์™€ sys.path์˜ ์ฐจ์ด

- sys๋ž€?

sys ๋ชจ๋“ˆ์€ ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ์ด๋‹ค. ๋‹ต์„ ์ฐพ๊ธฐ ์ „์— sys ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์ฐพ์•„๋ณด์•˜๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ–ˆ๋‹ค.

์‹œ์Šคํ…œ ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ, ํ•จ์ˆ˜ (System - specific parameters and funcions)
์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜, ์œ ์ง€๋˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜ & ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ํ•จ์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ. ํ•ญ์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (It is always available)

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ ํ•ด๋‹น ๋ชจ๋“ˆ์ด ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

sys.argv

๋ช…๋ นํ–‰์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ๊ฒƒ. python ๋ช…๋ น์–ด ๋’ค์˜ ๋ชจ๋“  ๊ฒƒ๋“ค์ด ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋‰˜์–ด์„œ sys.argv ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ๊ฐ€ ๋œ๋‹ค. ๋งŒ์•ฝ ๋ช…๋ น์„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— -ccommand line option์„ ์‚ฌ์šฉํ•ด์„œ ์‹คํ–‰ํ–ˆ๋‹ค๋ฉด argv[0]๋Š” '-c'๋กœ ๋ฐ”๋€๋‹ค. ๋งŒ์•ฝ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— pass๋˜๋Š” script name์ด ์—†๋‹ค๋ฉด argv[0]์€ ๋นˆ ๋ฌธ์ž์—ด์ด ๋œ๋‹ค.

  • sys.argv๋กœ ๋ฐ›๋Š” ๊ฐ’๋“ค์€ string์ด๋‹ค.
  • argv[0]์€ sciprt ์ด๋ฆ„์ด๊ณ  OS์— ๋”ฐ๋ผ full path์ด๊ฑฐ๋‚˜ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค.

sys.exit

๊ฐ•์ œ๋กœ ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒํ•˜๊ธฐ. Ctrl+Z๋‚˜ Ctrl+D๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋Œ€ํ™”ํ˜• ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จ์‹œํ‚จ๋‹ค.

- ๋‘ ๋ณ€์ˆ˜์˜ ์ฐจ์ด์ 

1) sys.modules

  • Dictionary { key: value } ๋กœ ์ €์žฅ๋œ๋‹ค.
  • ์ด๋ฏธ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์„ ๋ชจ๋“ˆ ์ด๋ฆ„์œผ๋กœ ํ™•์ธ(map)ํ•˜๊ณ , ๋ชจ๋“ˆ๋“ค์„ ๋‹ค์‹œ ๋ถ€๋ฅด๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ณ , ์ค‘์š” ์•„์ดํ…œ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๋„ ์•ˆ ๋œ๋‹ค. (may cause Python fail)

ํ„ฐ๋ฏธ๋„์—์„œ sys๋ฅผ importํ•˜๊ณ  module์„ ์จ๋ณด์•˜๋‹ค. ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์ค‘๊ฐ„๊นŒ์ง€๋งŒ ๋ถ™์—ฌ์™”๋‹ค.

import sys
sys.modules 

# retult: {'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>}

print(sys.modules.keys()) #key๋งŒ ๋ถ€๋ฅผ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜์˜จ๋‹ค
# result
'''['os.path', 'os', 'exceptions', '__main__', 'ntpath', 'strop', 'nt','sys', '__builtin__', 'site', 'signal', 'UserDict', 'string', 'stat']'''

2) sys.path

  • List [ 'string' ]
  • ๋ชจ๋“ˆ์„ ์ฐพ๋Š” ๊ฒฝ๋กœ๋ฅผ string(๋˜๋Š” bytes)์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
  • ๋ชฉ์ ์— ๋”ฐ๋ผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ„ฐ๋ฏธ๋„์—์„œ sys๋ฅผ importํ•˜๊ณ  path๋ฅผ ์จ๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™”๋‹ค.

import sys
sys.path

['', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Users/yeni/Library/Python/3.7/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']

sys.path[0]=' ' ์ธ ์ด์œ 

์ดˆ๊ธฐํ™” ์ดํ›„ sys.path์˜ ์ฒซ๋ฒˆ์งธ ์•„์ดํ…œpath[0]์€ python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋œ script๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋‹ค. ๋งŒ์•ฝ script ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ๋Š” ๋นˆ ์ƒํƒœ์ด๋‹ค. ๊ทธ๋ž˜์„œ command line์œผ๋กœ ํŒŒ์ด์ฌ์„ ์“ฐ๋ฉด script๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ''๋กœ ํ‘œ์‹œ๋œ๋‹ค. ์ด ๋•Œ๋Š” ํŒŒ์ด์ฌ์ด ์ตœ๊ทผ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ชจ๋“ˆ์„ ์ฐพ๊ฒŒ๋” ํ•œ๋‹ค.

script

script๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด์šฉ์„ ๋‹ด๊ณ ์žˆ๊ณ , ๊ทธ ์ž์ฒด๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ˜๋ฉด module์€ library์— ์ฐธ์กฐ๋˜์–ด ๊ทธ ์ž์ฒด๋กœ๋Š” ์‹คํ–‰์ด ๋ถˆ๊ฐ€ํ•˜ํ•˜๊ณ  ์“ฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค.

Environment variables

OS์˜ command line ๋˜๋Š” ํ„ฐ๋ฏธ๋„์— ์ผ๊ด€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํŒŒ์ด์ฌ์„ ๊ตฌ์„ฑํ•œ๋‹ค.

4.2 ํŒŒ์ด์ฌ์ด sys ๋ชจ๋“ˆ์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

python์€ sys.modules > built-in modules > sys.path ์ˆœ์œผ๋กœ ๋ชจ๋“ˆ์„ ์ฐพ๋Š”๋‹ค. sys๋Š” built-in module์ด๋‹ค. ๋•Œ๋ฌธ์— import sys๋ฅผ ํ•˜๋ฉด ํŒŒ์ด์ฌ์€ built-in ๋ชจ๋“ˆ์—์„œ sys๋ฅผ ์ฐพ์•„ ์‹คํ–‰ํ•œ๋‹ค.

- ์ถ”๊ฐ€์ ์ธ ์˜๋ฌธ

sys ๋ชจ๋“ˆ์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ์›๋ž˜๋ถ€ํ„ฐ(inherently) ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ import๋ฅผ ํ•ด์•ผ ํ• ๊นŒ? ์‚ฌ์‹ค ๋‚˜๋„ ์ฒ˜์Œ์— sys๋ฅผ ์จ๋ณด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ import๋ฅผ ๊นœ๋นกํ•ด์„œ ๊ณ„์† ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined

๋‹ต์œผ๋กœ stack overflow์˜ ์œ ์‚ฌ ์งˆ๋ฌธ์„ ์ฐธ๊ณ ํ–ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ์“ฐ๋ ค๋ฉด ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ฅด์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ์žˆ๊ธด ํ•˜๋‹ค.

์–ด์จŒ๋“  ํŒŒ์ด์ฌ ๊ฐœ๋ฐœ์ž ํŒ€์€ ๋ชจ๋“ˆ์ด ์ž๋™์ ์œผ๋กœ import๋˜์ง€ ์•Š๋„๋ก ๊ฒฐ์ •ํ–ˆ๊ณ , ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์š”์ฒญ์„ ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์„œ importํ•˜์ง€ ์•Š๋Š” ์ด์ƒ sys๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ์ ์„ ๋น„์ถ”์–ด๋ดค์„ ๋•Œ, ๋‚ด์žฅ๋˜์ง€ ์•Š์€ ๋ชจ๋“ˆ๋“ค์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์—๊ฒŒ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋„ค์ด๋ฐ ์„ ํƒ๊ถŒ์„ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋„ ์žˆ๋‹ค.

๊ณต์‹ ๋ฌธ์„œ 6.1.2. The Module Search Path
๋ชจ๋“ˆ spam์ด import๋  ๋•Œ, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” built-in module์—์„œ spam์„ ์ฐพ๋Š”๋‹ค. ๋งŒ์•ฝ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, spam.py ๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ sys.path ๋ณ€์ˆ˜์— ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŠธ์—์„œ ์ฐพ๋Š”๋‹ค.

sys.path๋Š” ์•„๋ž˜ ๊ฒฝ๋กœ์—์„œ ์‹œ์ž‘๋œ๋‹ค.

  • input script๋ฅผ ํฌํ•จํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ (์•„๋ฌด ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๊ฐ€์žฅ ์ตœ๊ทผ ๋””๋ ‰ํ† ๋ฆฌ)
  • PYTHONPATH: shell ๋ณ€์ˆ˜ syntax์™€ ๋˜‘๊ฐ™์€ syntax๋กœ, ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„๋“ค์˜ ๋ฆฌ์ŠคํŠธ.
  • ์„ค์น˜ ์˜์กด์ ์ธ ์ดˆ๊ธฐ๊ฐ’ (The installation-dependent default)

4.3 ์ ˆ๋Œ€๊ฒฝ๋กœ, ์ƒ๋Œ€ ๊ฒฝ๋กœ์˜ ์ฐจ์ด

  • ์ ˆ๋Œ€ ๊ฒฝ๋กœ: ์œ„์น˜์— ์ƒ๊ด€ ์—†์ด ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •์˜
  • ์ƒ๋Œ€๊ฒฝ๋กœ: ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •์˜

์ ˆ๋Œ€ ๊ฒฝ๋กœ๋Š” ๊ธฐ์ค€์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ—ท๊ฐˆ๋ฆด ์ผ์ด ์—†๊ณ , ์ˆœ์„œ๋Œ€๋กœ๋งŒ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋งŽ์ด ๋‚ด๋ ค๊ฐ€๊ฑฐ๋‚˜, ํŒŒ์ผ ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ๊ธธ ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

from package1 import module1 # ํŒจํ‚ค์ง€1์˜ ๋ชจ๋“ˆ1์„ ๊ฐ€์ ธ์˜ค์ž
from package1.module2 import function1 #ํŒจํ‚ค์ง€1์˜ ๋ชจ๋“ˆ2์˜ ํ•จ์ˆ˜1์„
from package2.subpackage1.module5 import function2 #ํŒจํ‚ค์ง€2 ๋‚ด ํŒจํ‚ค์ง€1์˜ ๋ชจ๋“ˆ5์—์„œ ํ•จ์ˆ˜2๋ฅผ ๊ฐ€์ ธ์˜ค์ž

๋ฐ˜๋ฉด ์ƒ๋Œ€๊ฒฝ๋กœ๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ์œ„, ํ•˜์œ„๋ฅผ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ์งง์€ ์ฝ”๋“œ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ฒฝ๋กœ ์ •์˜๊ฐ€ ๋‹ค์†Œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๊ณ  ํŒŒ์ผ์ด ์œ„์น˜ํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋ฐ”๋€” ๊ฒฝ์šฐ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

  • dot(.): ํ˜„์žฌ ๊ฒฝ๋กœ
  • dot dot(..): ์ƒ์œ„ ๊ฒฝ๋กœ
# package2/module3.py
from . import class1 #ํŒจํ‚ค์ง€2์˜ ๋ชจ๋“ˆ3์—์„œ ํด๋ž˜์Šค1์„ ๊ฐ€์ ธ์˜ค์ž
from .subpackage1.module5 import function2 
# ํŒจํ‚ค์ง€2 ๋‚ด ์„œ๋ธŒํŒจํ‚ค์ง€1์˜ ๋ชจ๋“ˆ5์—์„œ ํ•จ์ˆ˜2๋ฅผ ๊ฐ€์ ธ์˜ค์ž

# subpackage1/module5.py
from ..module4 import class4 
# ํŒจํ‚ค์ง€2์˜ ๋ชจ๋“ˆ4์—์„œ ํด๋ž˜์Šค4๋ฅผ ๊ฐ€์ ธ์˜ค์ž(subpackage์˜ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์ธ ํŒจํ‚ค์ง€2๋กœ ์ ‘์†ํ•œ ๊ฒƒ)

๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค ๐Ÿ˜ƒ

5. exception

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์˜ˆ์™ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ exception์ด๋ผ๊ณ  ํ•œ๋‹ค. ์™„๋ฒฝํ•œ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์œผ๋กœ ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ํŠนํžˆ ์œ ์ €์˜ input์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋  ๋•Œ๋Š” ์–ด๋–ค data type์„ ๋„ฃ์„์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— exception์ด ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’๋‹ค.

exception์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์ฝ”๋“œ ์œ„์น˜์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค. ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด exception handling์„ ํ•œ๋‹ค.

try except ๊ตฌ๋ฌธ

def return_elem_or_minus_one(index):
    short_list = [1, 2, 3]
    elem = 0

    try:
        elem = short_list[index]
        print("์ด ๋ฌธ์žฅ์€ exception์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค")
    except IndexError: # ํŠน์ • exception์„ catchํ•  ์ˆ˜๋„ ์žˆ๊ณ 
        print(f"์ด ๋ฌธ์žฅ์€ Exception์ด ๋ฐœ์ƒํ•˜๋ฉด ์‹คํ–‰ ๋ฉ๋‹ˆ๋‹ค")
        elem = -1
    except Exception as e: # ๋ชจ๋“  exception์„ ๋ฐ›์•„, exception์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ์ •๋ณด๋ฅผ ๋” ์–ป์„ ์ˆ˜๋„ ์žˆ๋‹ค.
        print(f"IndexError๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ Exception์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค ==> {e}")
        elem = -1
    else: # ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๋•Œ 
        print(f"Exception์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!") 
    finally:
        print("์ด ๋ฌธ์žฅ์€ exception ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค!")

    return elem

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