파이썬 기초 4-2 . 패키지 와 예외처리

MANBOKWAK·2024년 1월 16일

파이썬 기초

목록 보기
9/15

패키지

1. 패키지란?

  • 관련있는 모듈들의 집합을 의미

  • 패키지는 도트(.)을 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게해줌

  • A.B 라는 모듈 이름의 경우 A가 패키지이름, B가 모듈이름을 의미

smartphone/
	__init__.py
    camera/
    	__init__.py
    	shutter.py
        gallery.py
    call/
    	__init__.py
        contact.py
        message.py
    time/
    	__init__.py
        stopwatch.py
        alarm.py
  • 위처럼 smartphone, camera, call, time은 디렉토리를 의미

  • 확장자가 .py인 파일은 모듈을 의미

  • 패키지 구조로 파이썬 프로그램을 만드는것이 공동 작업이나 유지보수 측면에서

  • 확장자가 .py인 파일은 모듈을 의미


2. 패키지 만들기

  • 위에서 작성항 패키지 구조로 패키지를 생성해보자

1. 작업 디렉토리안에 smartphone 및 기타 서브 디렉토리를 생성하자

2. 각 파이썬 파일에서 테스트 만들기

  • 함수명은 각파일명_test로 설정

  • 함수가 실행되면 각 모듈명이 출력됨

  • 위와 같은 형식으로 모든 파일에 테스트 함수를 생성

3.PYTHON 환경변수에 디렉터리 추가후 파이썬 인터프리터 작동시키기

  • set PYTHONPATH=C:\~형식으로 패키지의 상위디렉토리의 절대 경로값을 넣어주면됨

  • python 명령어로 인터프리터를 실행 시킬 수 있음

4. 패키지 안의 함수 실행 시키기

  • contact 모듈을 임포트하여 실행하는 방법

  • contact모듈이 있는 디렉토리 까지를 from.. import하여 실행 시키는 방법

  • contact_test함수를 직접 임포트하여 사용하는 방법

  • 위 코드처럼 import smartphone를 하고 사용하면 오류가 발생

  • import smartphone를 수행하면 smartphone 디렉터리의 모듈 또는 smartphone 디렉토리의 __init__ py에 정의한것만 사용할 수 있음

  • 위처럼 임포트 하는것도 사용할 수 없음 import문에서 맨마지막은 항상 패키지여야 하기떄문

  • 위 코드는 함수를 임포트해서 오류가 발생함


3. __init__.py의 용도

  • __init__.py는 해당 디렉토리가 패키지의 일부임을 알려주는 역할

  • 디렉토리속에 __init__.py가 없다면 패키지로 인식이 되지 않음

  • __init__.py를 설정해주지 않아서 오류가 발생함

  • 위와 같이 특정 디렉토리의 모듈을 *을 사용하여 임포트 할때는 __init__.py를 설정해주어야됨

  • camera 디렉토리속 __init__.py__all__ 을 작성하고 아래 이미지와 같이 임포트하니가 정상 작동되는것을 확인할 수 있음

4. relative 패키지

  • 만약 contact디렉토리의 message.py모듈이 camera 디렉토리의 gallery.py모듈을 사용하고 싶을때는 아래와 같이 message.py모듈에 import문을 작성하면된다.
# message.py
from smartphone.camera.gallery import gallery_test

def message_test():
    print("message")
    gallery_test()

  • 인터프리터에서 위와같이 확인할 수 있음

  • 위 경우 전체경로를 사용해 import하는 경우

relative하게 import하기

# message.py
from ..camera.gallery import gallery_test

def message_test():
    print("message")
    gallery_test()
  • import문이 from smartphone.camera.gallery import gallery_test에서 from ..camera.gallery import gallery_test로 변경되었음

  • ..은 부모디렉토리를 의미함

  • ..와 같은 relative한 접근자는 모듈안에서만 사용이 가능함


예외 처리

  • 오류를 무시하고 싶을때 예외 처리를 사용

  • 파이썬은 try, exception을 사용해서 오류를 처리할 수 있게 해줌

1. 오류는 언제 발생하는가?

  • 파이썬은 오류가 발생하면 프로그램을 중단하고 오류 메시지를 출력해줌

디렉토리 안에 없는 파일을 열때

  • FileNotFoundError이 발생

0으로 다를 숫자를 나누는 경우

  • ZeroDivisionError이 발생

없는 인덱스를 참조할때

  • IndexError이 발생

2. 오류 예외 처리기범

try,except문

try:
	...
except [발생 오류[as 메시지 변수]]:
	...
  • try, except문의 기본 구조

  • try 블록 수행중 오류가 발생하면 except블록이 수행됨

  • but, try 블록에서 오류가 발생하지 않는다면 except문도 수행안됨

  • except 구문은 except [발생 오류[as 메시지 변수]]: 형식으로 사용되는데 []기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기법

except구문을 사용하는 3가지방법

  1. try, except만 사용
try:
	...
except:
	...
  • 오류에 종류에 상관없이 오류가 발생하면 except블록을 수행
  1. 발생 오류만 포함한 except문
try:
	...
except 발생 오류:
	...
  • 오류가 발생했을 때 except문에 미리 정해놓은 오류 이름과 일치할때만 except블록을 수행
  1. 발생 오류와 오류 메시지 변수까지 포함한 except문
try:
	...
except 발생 오류 as 오류 메시지 변수:
	...
  • 오류 메시지의 내용까지 알고싶을때 사용하는 방법

try ... finally

  • try문에는 finally 절을 사용할 수 있음

  • finally절은 try문 수행 도중 예외 발생 여부 상관없이 항상 수행됨

  • 보통 finally절은 사용한 리소스를 close해야 할 때에 많이 사용


3. 여러개의 오류 처리하기

try:
	...
except 발생 오류 1:
	...
except 발생 오류2:
	...
  • 위 형식으로 여러개의 오류를 처리할 수 있음
try:
    a = [1,2]
    print(a[3])
    4/0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("인덱싱 할 수 없습니다.")

  • 위 예제에서 "인덱싱 할 수 없습니다."라는 에러가 먼저 발생하므로 ZeroDivisionError은 발생하지 않음

4. 오류 회피하기

  • 프로그래밍을 하다보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있음
try:
    f = open('unexist.txt', 'r')
except FileNotFoundError:
    pass
  • 파일은 존재하지 않지만 FileNotFoundError을 예외처리해 패스 시키는 코드이다

5. 일부러 오류 발생시키기

  • 오류를 일부로 발생시켜야 하는 경우도 있음

  • 파이썬은 raise명령어를 사용해 오류를 강제로 발생시킬 수 있음

  • 예를들어 Bird 클래스를 상속받은 자식 클래스는 반드시 fly라는 함수를 구현하도록 만들고 싶은 경우가 있다

class Bird:
	def fly(self):
    	raise NotImplementedError

class Eagle(Bird):
	pass
    
eagle = Eagle()
eagle.fly

  • 자식 클래스가 fly함수를 구현하지 않고 fly함수를 호출하면 fly함수가 구현되지 않았기 때문에 NotImplementedError이 발생

  • 오류가 뜨지 않게하려면 Eagle클래스에서 fly함수를 구현하면됨


6. 예외 만들기

  • 프로그래밍 수행 도중 특수한 경우에만 예외 처리를 하기 위해서 예외를 만들어서 사용하기도함
class Myerror(Exception):
    pass

def say_nick(nick):
    if nick == '바보':
        raise Myerror()
    print(nick)

say_nick('천사')
say_nick('바보')

  • 예외를 만들기 위해서는 파이썬의 내장 클래스인 Exception을 상속 받으면됨

  • 예외이기떄문에 try exception에도 사용가능함

class Myerror(Exception):
    pass

def say_nick(nick):
    if nick == '바보':
        raise Myerror()
    print(nick)

try:
    say_nick('천사')
    say_nick('바보')
except Myerror:
    print("허용되지 않는 별명입니다.")

  • try excpet문에 사용할 수 있음
class Myerror(Exception):
    def __str__(self):
        return '허용되지 않는 별명입니다.'

def say_nick(nick):
    if nick == '바보':
        raise Myerror()
    print(nick)

try:
    say_nick('천사')
    say_nick('바보')
except Myerror as e:
    print(e)

  • 오류 메시지를 사용하기 위해서는 오류 클래스에 __str__ 메서드를 구현해야함
profile
Backend/ DevOps를 지망하는 곽희상입니다.

0개의 댓글