본문 바로가기
IT & 데이터 사이언스/Python

[Python] Python의 모듈, 패키지, 예외처리

by 바른 호랑이 2024. 4. 23.
728x90
반응형

안녕하세요. 바른 호랑이입니다.

이번 게시글에서는 Python의 모듈, 패키지, 예외처리에 대해 알아볼 예정입니다.

 

- 모듈(Module)

ㆍ모듈이란 함수나 변수 또는 클래스들을 모아놓은 파일로 다른 python 프로그램에서 사용할 수 있게끔 만들어진 python파일이라고도 할 수 있음. 

ㆍ간단한 자체 제작 모듈 실행법

(기본구조 : python파일 작성 후 python을 해당 파일이 위치한 곳에서 실행 후 모듈 import 하여 실행)

 

ㆍpython을 다른 경로에서 실행해도 자체제작한 python파일 import 후 사용방법(VS Code에서 테스트 실행(별도 언급 없는 것들은 모두 colab에서 실행함.) 

(기본구조 : sys.path에 해당 파일이 위치한 경로 추가 후 import 하여 실행)

 

ㆍ파일내부에 파일이 직접 실행될 경우에만 실행되기를 원하는 코드들이 있을 때 처리방법

(__name__ == '__main__' 조건 사용)

 

ㆍ모듈을 작성할 경우에도 다른 모듈들을 불러와서 사용할 수 있지만, 각 모듈 간 종속성과 결합도를 증가시킬 수 있기에 필요성을 충분히 검토 후 사용하는 것이 필요함.

 

- 패키지(Package)

ㆍ도트(.)를 이용하여 python 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 만드는 것으로 간단한 python 작업이 아니면 패키지 구조로 python 프로그램을 만드는 것이 공동작업 및 유지보수에 유리함.

ㆍ가상의 패키지 예시

ㆍ__init__.py를 작성하지 않고 game 패키지만 import 해서 사용하려고 하면 에러가 발생함. __init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 하며 패키지에 포함된 디렉터리에 __init__.py 파일이 없으면 패키지로 인식되지 않음. 추가적으로 from~import가 아니라 import만 할 경우에는 반드시 마지막 항목은 모듈 또는 패키지 여야함.

(python 3.3버전부터는 해당 파일이 없어도 패키지로 인식이 되지만, 하위 버전 호환을 위해 해당 파일을 생성하는 것이 안전함.)

import game.sound.echo
game.sound.echo.echo_test()

실행결과

from game.sound import echo
echo.echo_test()

실행결과

from game.sound.echo import echo_test
echo_test()

실행결과

import game
game.sound.echo.echo_test()

실행결과

import game.sound.echo.echo_test

실행결과

ㆍ__all__을 __init__.py파일내부에서 정의해주지 않고 from 모듈이름 import * 사용 시 오류가 발생함. 특정 디렉터리의 모듈을 "*"를 이용하여 import 하기 위해서는 해당 디렉터리의 __init__.py 파일에 __all__이라는 변수를 설정하고 import 할 수 있는 모듈을 정의해주어야 함.

from game.sound import *
echo.echo_test()

__init__.py 내부의 __all__ 변수 수정 전후 결과 차이

ㆍ다른 디렉토리 내부의 타 모듈이 다른 모듈을 사용하게끔 만들고 싶다면 전체 패키지 경로를 import 해서 사용하는 방법과 relative를 활용해서 코드 작성이 가능함. 단, relative는 모듈 안에서만 활용이 가능하므로 주의해야 함.

# game/graphic/render.py
# 방법1
# from game.sound.echo import echo_test
# 방법2 -- relative활용 ".."은 부모 디렉토리를 의미함.
from ..sound.echo import echo_test

def render_test():
  print("render")
  echo_test()
import game.graphic.render
game.graphic.render.render_test()

실행결과

 

- 예외 처리

ㆍ프로그램을 작성하다 보면 오류가 발생할 수 있으며, 이와 같은 오류를 무시하거나 별도의 행동으로 작성하고 싶을 때에는 해당 상황과 관련하여 예외처리를 진행해야 함. python은 try, except문으로 오류를 예외처리할 수 있고, 약간 변형하여 try, finally문과 try, else문을 추가로 사용할 수도 있음. 예외 발생 시 따로 처리를  안 하고 싶으면 except문 아래 코드에 pass만 입력하면 되고, 만약 에러를 일부러 일으켜야 한다면 raise명령어를 사용할 수 있음.

# 기본적인 try, except문
'''
# 기본 문법
try:
   ...
except [발생 오류[as 오류 메시지 변수]]:
   ...
'''

# 방법 1
try:
    4 / 0
except:
  print('Occur Error')

# 방법 2
try:
    4 / 0
except ZeroDivisionError:
  print("ZeroDivisionError")

# 방법 3
try:
    4 / 0
except ZeroDivisionError as e:
  print(e)

실행결과

# 응용
try:
  f = open('test_01.txt', 'r')
except FileNotFoundError as e:
  print(str(e))
else: # test_01.txt 파일이 없으면 except문이 실행되고, 있다면 else절이 수행됨.
  data = f.read()
  f.close()

실행결과

# 응용
try:
  f = open('test_02.txt', 'w')
finally: # try문이 수행된 이후 예외 발생 여부에 상관없이 finally아래 코드문 실행
  print(1)
  f.close()

실행결과

try:
  raise NotImplementedError
except:
  print('test')

실행결과

 

728x90
반응형

댓글