- 필요성
- 팀작업 -> 작업에 대한 분업 -> 공간/역할 등에 따라 개별적으로 배치(공통 작업이 아니라면)
- 위 작업이 완료되면 다른 사람들이 만든 모듈을 가져와서 사용해야 함(모듈 가져오기)
- 실습구조
/
L 6.모듈화_모듈가져오기_예외처리.ipynb : 현재 파일
L a : 패키지, 디렉토리
L b : 패키지, 디렉토리
L __init__.py : b 패키지를 대변하는 모듈
L mod.py : 일반 모듈
L __init__.py : a 패키지를 대변하는 모듈
# a > __init__.py
PI1 = 3.14
# a > b > __init__.py
PI2 = 3.144
# a > b > mod.py
# 변수
PI3 = 3.145678
# 함수
def add(x, y):
return x + y
# 클래스
class A : pass
from 패키지1.패키지2.패키지3.....모듈 import 변수|함수|클래스|*(모든것)
from 패키지1.패키지2.패키지3.....패키지 import 변수|함수|클래스|*(모든것)
from 모듈|패키지 import 변수|함수|클래스|*(모든것)
# 필요 시 별칭을 모듈 가져온 후 객체의 이름으로 사용
import ... as 별칭
# from ~ import ~ 유형 사용
#PI3, add, A를 가져와서 사용하시오 > mod.py를 가져와서 사용
# 타인이 만든 세부모듈(변수 등)을 내가 만든 것처럼 사용
from a.b.mod import PI3, add, A
PI3, add(1,2), A()
결과값 : (3.145678, 3, <a.b.mod.A at 0x7cfedd00cd10>)
------------------------------------------------------------------------
# 위와 같은 패턴으로 PI2 사용
from a.b.__init__ import PI2
PI2
결과값 : 3.144
------------------------------------------------------------------------
# a 패키지가 소유한 모든 변수, 함수, 클래스 가져오기
from a import *
PI1
결과값 : 3.14
import 패키지.패키지.패키지.....모듈
import 패키지.패키지.패키지.....패키지
import 모듈|패키지
# 필요 시 별칭을 모듈 가져온 후 객체의 이름으로 사용
import ... as 별칭
import a.b.mod
# 경로를 모두 작성해서 변수/함수/클래스에 접근해야함 -> 전체 경로에 별칭 부여하면 좋음
a.b.mod.PI3
결과값 : 3.145678
--------------------------------------------------------------------------
# 경로가 길거나 이름이 길다면 별칭 부여하면 좋음
import a.b.mod as m
m.PI3
결과값 : 3.145678
--------------------------------------------------------------------------
# 예시
import pandas as pd
import numpy as np
import tensorflow as tf
--------------------------------------------------------------------------
# PI2는 b아래 __init__.py에 있고, init은 b를 대변하는 파일이기 때문에 a.b만 하면 됨
import a.b as my
my.PI2
결과값 : 3.144
- __init__.py
- 특수 목적을 가진 파일, 패키지 하위에 위치해서 해당 패키지를 대변함
- python 3.3 이하 하위버전 호환때문에 제공되었음
- 함수 지향적 프로그래밍, 객체 지향적 프로그래밍에서 프로그램을 시작하는 코드에서 주로 사용됨
# py 파일의 가장 마지막 라인에 위치함
if __name__ == '__main__':
main() # 프로그램 시작 함수(사용자 정의했다면)
- 유형 2
- 남이 만든 코드에서 사용한다면 그리고 이 코드를 내가 가져와서 (엔트리 포인트) 모듈을 사용한다면
"파일명"으로 해석됨
-> 내가 쓰면 __main__, 남이 쓰면 파일명
- 개념
- 프로그램은 셧다운 X
- 잠재된 오류 상황에 처리 필요
- 꼼꼼하게 시나리오 검토하여 처리(방지)
- 조건문이 많이 보임(사용됨)
- LBYL : Look Before You Leep
- 예외가 나올만한 상황을 꼼꼼하게 체크하여 코드를 구성
- 진행 > 오류발생 > 수습
- 코드를 계속 진행. 수습은 나중에 진행(개발 단계)
- EAFP : Easier to Ask Forgiveness than Permission
try:
print(1)
pass
except Exception as e:
print('예외 발생', e)
pass
else:
print('정상')
pass
finally:
print('뒷정리')
pass
결과값 :
1
정상
뒷정리
try:
print(1)
print(2, 1/0) # 오류 상황
print(3)
pass
except Exception as e:
print('예외 발생', e)
pass
else:
print('정상')
pass
finally:
print('뒷정리')
pass
결과값 :
1
예외 발생 division by zero
뒷정리
#오류 던지기 -> 웹 상에서 많은 페이지에서 오류가 발생하면 던지기 처리하여 한 곳에서 일괄 처리할 수 있도록 함(벡엔드)
def exception_call():
# 오류 발생 -> 잡힘 -> 오류 내용 던지기 (처리는 x, 밖으로 넘겨버림)
try:
1/0
except Exception as e:
raise e
# 실제 오류 처리 파트
try :
exception_call()
except Exception as e:
print('오류 처리-로깅', e)
결과값 : 오류 처리-로깅 division by zero