on
Python 모듈과 패키지
Python 모듈과 패키지
코드잇의 파이썬 모듈과 패키지 강의를 듣고 정리한 내용입니다.
문제가 될 시 삭제하겠습니다.
파이썬 모듈과 패키지
1. 모듈
01. 모듈이란 ?
기능상 성격이 비슷한 또는 연관성 있는 변수와 함수들이 조립된 파일
02. 모듈 사용하기
# area.py def circle(radius): return 3.14 * radius * radius def square(radius): return 3.14 * radius * radius
area.py 와 run.py가 같은 폴더 안에 위치할 때 아래와 같이 import 파일명으로 모듈을 불러와서 함수를 사용
# run.py import area print(area.circle(2)) print(area.square(9)) print(area.PI)
03. 모듈을 가져오는 여러가지 방법들
# 특정 함수만 가져올 때 : area 모듈에서 circle 함수를 가져와라 from area import circle, square print(circle(2)) # area 모듈을 ar로 사용하겠다 import area as ar print(ar.circle(2)) # area 모듈의 모든 함수를 가져온다. 하지만 모듈에서 필요한 함수만 가져오는 것을 추천한다. from area import *
07. 현재 파일에서 사용 가능한 기능은?
dir 함수로 현재 파일에서 사용할 수 있는 함수를 알 수 있음
import area print(dir(()) ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'area'] print(dir(area)) ['PI', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'circle', 'square']
from area import circle, square print(dir()) ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'area', 'circle', 'square']
08. 네임스페이스
네임스페이스 : 파일에서 정의된 모든 이름 # 똑같은 이름의 함수가 나중에 정의된 것이 있으면 나중에 정의된 함수가 쓰임 from area import circle, square def square(length): return 4 * length print(dir()) print(square(3)) # 12 # 모듈에서 가져오는 함수 이름을 바꿔줄 수 있음 from area import circle, square as sq print(square(3)) print(sq(3))
10. 스탠다드 라이브러리
int, float, string 같은 자료형
print, dir 같은 내장 함수
유용한 기능을 제공하는 모듈들
13. 모듈 검색 경로
import sys print(sys.path) # 파이썬이 모듈을 찾기 위해 검색하는 경로가 나옴
sys.path 에 경로를 추가해줄 수 있음
import sys sys.path.append('/Users/codeit/Desktop')# macOS sys.path.append('C:\\Users\\codeit\\Desktop')# Windows
모듈을 import 하면 모듈안에 있는 모든 것이 실행됨
17. name 특수변수
__name__ 을 다른 곳에서 불러와서 사용하면 불러온 파일의 모듈명이 나옴 파일을 직접 실행하면 __main__ 으로 결과 값이 나옴 그래서 if __name__ == __main__ : true 이면 파일을 직접 실행했다는 의미
20. main 함수
java나 c, c++ 같은 언어들에서는 어떤 파일을 실행하기보다 파일 안에 있는 main() 이라는 함수를 실행한다.
main 함수는 말 그대로 주요 함수로서 프로그램을 작동시키는 코드를 담고 있다.
파이썬에서는 파일 실행 시 모든 코드가 처음부터 끝까지 실행되지만, main() 함수를 사용하면 가독성이 올라가기 때문에,
아래와 같이 main() 함수를 사용하는 것을 추천한다.
run.py
import area # 면적 계산기 프로그램 def main(): x = float(input('원의 지름을 입력해 주세요: ')) print('지름이 {}인 원의 면적은 {}입니다.
'.format(x, area.circle(x))) y = float(input('정사각형의 변의 길이를 입력해 주세요: ')) print('변의 길이가 {}인 정사각형의 면적은 {}입니다.'.format(y, area.square(y))) if __name__ == '__main__': main()
2. 패키지
01. 패키지란?
모듈의 묶음
프로그램의 구성요소를 쉽게 재활용할 수 있도록
02. 패키지 만들기
프로젝트 폴더 안에 Directory 를 만들고, 해당 Directory 에 모듈들을 넣기 폴더 안에 __init__ .py 라는 파일을 만들기
03. 패키지 사용하기
shapes/ __init__.py area.py volume.py run.py
import shapes.volume print(shapes.volume.cube(3)) import shapes.volume as vol print(vol.cube(3)) from shapes.area import square print(square(3)) # from shapes import volume == import shapes.volume import shapes print(shapes.area.circle(2))
06. __init__ 파일이란?
python 3.3 ver 이전에는 init 파일 필수 였음. python 3.4 이후에는 init 파일 필수 아님
패키지를 불러올 때 무조건 init 파일이 먼저 실행됨
07. __init__ 파일에서 모듈 임포트하기
__init__ 파일에서 정의해두고, 패지키 모듈을 부르면 __init__ 파일을 먼저 읽기 때문에, 가져와서 사용할수 있음
shapes/ __init__.py area.py volume.py run.py
__init__.py
PI = 3.14
volume.py
from shapes import PI
run.py 아래와 같이 패키지 밖에서도 패키지 내의 init 파일에 선언한 내용을 가져올 수 있다.
# PI 직접 임포트 from shapes import PI # 패키지 임포트 후 shapes. 으로 접근 import shapes shapes.PI
10. all 특수 변수
import *
모듈을 임포트할 때 from import * 를 하면 모듈의 모든 내용이 임포트됩니다.
하지만 모듈 대신 패키지에 from import * 를 하면 패키지 안에 있는 게 아무것도 임포트되지 않습니다.
__all__ 특수 변수
__all__ 특수 변수는 우리가 import * 를 했을 때 임포트 대상에서 어떤 것들을 가져와야 하는지를 정해 주는 변수입니다. 임포트 대상에서 내용 전체를 가져오라고 했을 때 '전체'가 무엇인지 정의해 주는 거죠. __all__ 은 모듈에도 적용되고 패키지에도 적용됩니다.
__all__ 과 모듈
모듈의 __all__ 은 모듈에 해당하는 파일에서 정의합니다. 예를 들어 area.py에 아래와 같은 코드를 추가해 주면:
shapes/area.py
# __all__ 정의 __all__ = ['circle', 'square'] PI = 3.14 # 원의 면적을 구해 주는 함수def circle(radius): return PI * radius * radius # 정사각형의 면적을 구해 주는 함수def square(length): return length * length
from shapes.area import * 를 했을 때 area 모듈의 모든 내용이 임포트되지 않고 circle 과 square 함수만 임포트됩니다.
__all__ 과 패키지
패키지의 __all__ 은 패키지에 해당하는 init 파일에서 정의합니다. 예를 들어 shapes 패키지의 init 파일에 아래와 같은 코드를 추가해 주면:
shapes/__init__.py
# __all__ 정의 __all__ = ['area', 'volume']
이제 from shapes import * 를 하면 area 모듈과 volume 모듈이 임포트됩니다.
__all__ 을 사용하면 패키지나 모듈에 import * 를 했을 때 어떤 것들이 임포트되는지를 제어할 수 있습니다. 그래도 여전히 import * 만 봐서는 정확히 어떤 것들이 임포트되는지를 알 수 없기 때문에 import * 는 프로그램에서 정의되는 이름들, 즉 네임스페이스를 완벽히 이해하고 있을 때만 사용하는 것을 추천드립니다.
12. init 파일과 all 사용해보기
같은 패키지에서 init 파일을 정의할 때는 from 패키지네임.모듈이름 import * 로 정의할 수 있음 패키지 외부에서 import 패키지명으로 불러왔을 때, init 에서 불러온 함수나 변수를 사용할 수 있음
13. 서브패키지
패키지 안에 있는 패키지
14. 서브패키지 사용하기
import ...
첫 번째 방식은 import ... 방식입니다.
run.py
# 패키지 임포트import mymath # 서브패키지 임포트import mymath.shapes # 모듈 임포트import mymath.shapes.area # 모듈 안에 있는 변수나 함수는 이 방식으로 임포트 할 수 없음import mymath.shapes.area.circle# 오류
그냥 import 뒤에 가져오고 싶은 모듈이나 패키지를 써 주면 됩니다. 하지만 모듈 안에 있는 변수나 함수는 이 방식으로 임포트 할 수 없습니다.
그리고 (서브)패키지를 임포트할 때는 (서브)패키지 안에서 임포트하고 싶은 걸 (서브)패키지의 init 파일에 적어줘야겠죠?
from ... import ...
두 번째 방식은 from ... import ... 방식입니다.
run.py
# 패키지 안에 있는 패키지 임포트from mymath import shapes # 패키지 안에 있는 모듈 임포트from mymath.shapes import area # 모듈 안에 있는 함수 임포트from mymath.shapes.area import circle # import 뒤에는 . 을 쓸 수 없음from mymath import shapes.area# 오류
from 뒤에는 모듈이나 패키지가 올 수 있습니다. import 뒤에는 모듈이나 패키지 안에서 가져오고 싶은 걸 써 줍니다. import 뒤에는 . 을 쓸 수 없습니다.
17. 상대 경로 임포트
__init__.py from mymath.shapes import area, volume from . import area, volume # . 은 현재 init 파일의 위치를 의미 from .area import * from .volume import *
from http://minimilab.tistory.com/72 by ccl(A) rewrite - 2021-10-09 19:01:53