32. 모듈(Module)과 패키지(Package)
1. 키워드
- 모듈(Module)
- 패키지(Package)
- 네임스페이스(Namespace)
- 파이썬 표준 라이브러리(PSL: Python Standard Library)
- 파이썬 패키지 인덱스(PyPI: Python Package Index)
2. 모듈과 패키지 사용하기
- 모듈은 각종 변수, 함수, 클래스를 담고 있는 파일이고, 패키지는 여러 모듈을 묶은 것이다.
모듈, 패키지, 라이브러리
- 모듈은 특정 기능을 .py 파일 단위로 작성한 것이다.
- 패키지는 특정 기능과 관련된 여러 모듈을 묶은 것으로, 모듈에 네임스페이스를 제공한다.
- 파이썬 표준 라이브러리는 파이썬에 기본으로 설치된 모듈과 패키지, 내장 함수를 묶은 것이다.
3. import
로 모듈 가져오기
- 모듈은
import
키워드로 가져올 수 있다.
- 그럼 간단하게 파이썬 표준 라이브러리의 수학 모듈
math
를 가져와서 원주율을 출력해 보자.
import
에 모듈 이름을 지정하면 해당 모듈을 가져올 수 있으며,path.pi
와 같이모듈.변수
형식으로 모듈의 변수를 사용한다.
- 이번에는
math
모듈의 제곱근 함수sqrt
를 사용해 보자.
- 모듈의 함수는
math.sqrt(4.0)
과 같이모듈.함수()
형식으로 사용한다.
1) import as
로 모듈 이름 지정하기
- 모듈의 함수를 사용할 때
math.sqrt
처럼 일일이math
를 입력하기 귀찮은 경우가 생기는데, 이때는import as
를 사용하여 모듈의 이름을 지정할 수 있다.
- 이제
math
모듈을m
으로 줄여보자.
import math as m
과 같이 모듈을 가져오면서as
뒤에 이름을 지정해 준다.- 이후
math
모듈을 사용할 때m
으로 줄여서 사용할 수 있다.
2) from import
로 모듈의 일부만 가져오기
import as
로 모듈의 이름을 지정하는 방법보다 더 편한 방법이 있는데,from import
로 원하는 변수만 가져올 수 있다.
- 다음은
math
모듈에서 변수pi
만 가져온다.
from math import pi
와 같이from
뒤에 모듈 이름을 지정하고import
뒤에 가져올 변수를 입력한다.- 이후 가져온 변수를 사용할 때는
pi
와 같이 모듈 이름을 붙이지 않고 바로 사용하면 된다.
- 모듈의 변수를 가져왔으니 이번에는 함수(클래스)를 가져와보자.
- 다음은
math
모듈에서sqrt
함수만 가져온다.
math
모듈에서sqrt
함수만 가져왔으므로sqrt(4.0)
처럼 앞에math
를 붙이지 않고 함수를 바로 사용할 수 있다.
- 지금까지 변수나 함수를 하나만 가져왔지만
math
모듈에서 가져올 변수와 함수가 여러 개일 수도 있다. - 이때는
import
뒤에 가져올 변수, 함수, 클래스를,
(콤마)로 구분하여 여러 개를 지정해 주면 된다.
- 다음은
math
모듈에서pi
,sqrt
를 가져온다.
>>> from math import pi, sqrt
>>> pi
3.141592653589793
>>> sqrt(4.0)
2.0
>>> sqrt(2.0)
1.4142135623730951
from math import pi, sqrt
와 같이pi
와sqrt
두 개를 가져왔지만 변수, 함수, 클래스가 두세 개가 아니라 수십 개가 된다면 입력하기 번거로울 것이다.from import
는 모듈의 모든 변수, 함수, 클래스를 가져오는 기능도 있다.
- 다음은
math
모듈의 모든 변수, 함수, 클래스를 가져온다.
from math import *
와 같이 지정하면math
모듈의 모든 함수, 변수, 클래스를 가져온다.
3) from import
로 모듈의 일부를 가져온 뒤 이름 지정하기
- 이번에는
from import
로 변수, 함수, 클래스를 가져온 뒤 이름을 지정해 보자.
- 다음은
math
모듈에서sqrt
함수를 가져오면서 이름을s
로 지정한다.
from import
로 가져온 변수, 함수, 클래스 뒤에as
로 이름을 지정해 주면 된다.
- 만약 여러 개를 가져왔을 때는 각 변수, 함수, 클래스 등을
,
(콤마)로 구분하여as
를 여러 개 지정하면 된다.
- 다음은
math
모듈의pi
를 가져오면서 이름을p
로,sqrt
를 가져오면서 이름을s
로 지정한다.
>>> from math import pi as p, sqrt as s
>>> p
3.141592653589793
>>> s(4.0)
2.0
>>> s(2.0)
1.4142135623730951
- 이처럼
as
를 사용하면 모듈의 이름을 원하는 대로 지정해서 사용할 수 있다.
가져온 모듈 해제하기, 다시 가져오기
import
로 가져온 모듈(변수, 함수, 클래스)은del
로 해제할 수 있다.
- 모듈을 다시 가져오려면
importlib.reload
를 사용한다.
4. import
로 패키지 가져오기
- 패키지는 특정 기능과 관련된 여러 모듈을 묶은 것인데, 패키지에 들어있는 모듈도
import
를 사용하여 가져온다.
- 파이썬 표준 라이브러리에서
urillib
패키지의request
모듈을 가져와보자.
>>> import urllib.request
>>> response = urllib.request.urlopen("http://www.google.co.kr")
>>> response.status
200
- 패키지에 들어있는 모듈은
import urllib.request
와 같이패키지.모듈
형식으로 가져온다. - 마찬가지로 모듈의 함수를 사용할 때도
urllib.request.urlopen()
과 같이패키지.모듈.함수()
형식으로 패키지 이름과 모듈 이름을 모두 입력해 준다.
urlopen
함수
urllib.request.urlopen
은 URL을 여는 함수인데 URL 열기에 성공하면response.status
의 값이200
이 나온다.- 이
200
은 HTTP 상태 코드이며 웹 서버가 요청을 제대로 처리했다는 뜻이다.
1) import as
로 패키지 모듈 이름 지정하기
- 패키지 안에 들어있는 모듈도
import as
를 사용하여 이름을 지정할 수 있다.
- 다음은
urllib
패키지의request
모듈을 가져오면서 이름을r
로 지정한다.
>>> import urllib.request as r
>>> response = r.urlopen("http://www.google.co.kr")
>>> response.status
200
2) from import
로 패키지의 모듈에서 일부만 가져오기
- 패키지도
from import
를 사용하여 모듈에서 변수, 함수, 클래스를 가져올 수 있다.
urllib
패키지의request
모듈에서urlopen
함수와Request
클래스를 가져와보자.
>>> from urllib.request import Request, urlopen
>>> req = Request("http://www.google.co.kr")
>>> response = urlopen(req)
>>> response.status
200
- 참고로
urlopen
함수에 URL을 바로 넣어도 되고,Request("http://www.google.co.kr")
와 같이Request
클래스에 URL을 넣은 뒤에req
를 생성해서urlopen
함수에 넣어도 된다.
- 패키지의 모듈에서 모든 변수, 함수, 클래스를 가져오는 방법은 다음과 같다.
- 다음은
urllib
의request
모듈에서 모든 변수, 함수, 클래스를 가져온다.
>>> from urllib.request import *
>>> req = Request("http://www.google.co.kr")
>>> response = urlopen(req)
>>> response.status
200
3) from import
로 패키지의 모듈의 일부를 가져온 뒤 이름 지정하기
- 이번에는
from import
로 패키지의 모듈에서 변수, 함수, 클래스를 가져온 뒤 이름을 지정해 보자.
- 다음은
urllib
패키지의request
모듈에서Request
클래스를 가져온 뒤 이름을r
로 지정하고,urlopen
함수를 가져온 뒤 이름을u
로 지정한다.
>>> from urllib.request import Request as r, urlopen as u
>>> req = r("http://www.google.co.kr")
>>> response = u(req)
>>> response.status
200
5. 모듈 만들기
- 파이썬 스크립트를 작성할 때마다 매번 비슷한 클래스와 함수를 작성한다면 코드도 길어지고 중복되는 부분이 생긴다.
- 이런 경우 공통되는 부분을 빼내서 모듈과 패키지로 만들면 되고, 이후 코드를 다시 만들지 않고 모듈과 패키지만 가져와서 사용하면 편리하다.
- 간단하게 2의 거듭제곱을 구하는 모듈을 만들어보자.
- 다음 내용을 프로젝트 폴더 안에
square2.py
파일로 저장한다.
- 이렇게 변수와 함수를 넣어서
square2.py
파일을 만들었다. - 이렇게 모듈을 만들었을 때 모듈 이름은
square2
가 된다. - 즉, 스크립트 파일에서 확장자
.py
를 제외하면 모듈 이름이 된다.
1) 모듈 사용하기
- 이제
square2
모듈을 사용해 보자. - 다음 내용을 프로젝트 폴더 안에
main.py
파일로 저장한 뒤 실행해 보자. - 이때
square2.py
파일과main.py
파일은 반드시 같은 폴더에 있어야 한다.
- 실행을 해보면
square2
모듈에 만들었던 변수base
의 값이 출력되고,square
함수도 호출된다. - 이처럼 모듈을 사용할 때는
import
로 모듈을 가져온 뒤모듈.변수
,모듈.함수()
형식으로 사용한다.
2) from import
로 변수, 함수 가져오기
- 모듈에서
from import
로 변수와 함수를 가져온 뒤 모듈 이름을 붙이지 않고 사용할 수도 있다.
3) 모듈에 클래스 작성하기
- 이번에는 모듈에 클래스를 작성하고 사용해 보자.
- 다음 내용을 프로젝트 폴더 안에
person.py
파일로 저장해 보자.
class Person:
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
def greeting(self):
print(f"안녕하세요. 저는 {self.name}입니다.")
- 이제 main.py 파일을 다음과 같이 실행해 보자.
- 모듈의 클래스를 사용하는 방법도 변수, 함수와 같다.
- 즉,
모듈.클래스()
형식으로 모듈의 클래스를 사용하며, 클래스로 인스턴스를 만들 때는person.Person("마리아", 20, "서울시 서초구 반포동")
과 같이 사용하면 된다.
4) from import
로 클래스 가져오기
- 물론 모듈에서
from import
로 클래스를 가져온 뒤 모듈 이름을 붙이지 않고 사용할 수도 있다.
>>> from person import Person
>>> maria = Person("마리아", 20, "서울시 서초구 반포동")
>>> maria.greeting()
안녕하세요. 저는 마리아입니다.
- 지금까지 만든
square2
,person
모듈을 그림으로 나타내면 다음과 같은 모양이 된다.
6. 모듈과 시작점 알아보기
- 파이썬 코드를 보다 보면
if __name__ == "__main__":
으로 시작하는 부분을 자주 만나게 된다.
- 이 코드는 현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용한다.
- 먼저
__name__
부터 알아보자. - 다음 내용을 프로젝트 폴더 안에
hello.py
파일로 저장해 보자.
- 그리고 다음 내용을 프로젝트 폴더 안에
main.py
파일로 저장한 뒤 실행해 보자.
import hello
print(f"main.py __name__: {__name__}")
# hello 모듈 시작
# hello.py __name__: hello
# hello 모듈 끝
# main.py __name__: __main__
- 실행을 해보면
hello.py
파일과main.py
파일의__name__
변수 값이 출력된다. - 파이썬에서
import
로 모듈을 가져오면 해당 스크립트 파일이 한 번 실행된다. - 따라서
hello
모듈을 가져오면hello.py
안의 코드가 살행된다. - 따라서
hello.py
의__name__
변수에는'hello'
가 들어가고,main.py
의__name__
변수에는'__main__'
이 들어간다.
- 즉,
__name__
은 모듈의 이름이 저장되는 변수이며import
로 모듈을 가져왔을 때 모듈의 이름이 들어간다. - 하지만 파이썬 인터프리터로 스크립트 파일을 직접 실행했을 때는 모듈의 이름이 아니라
'__main__'
이 들어간다.
- 좀 더 정확하게 알아보기 위해 콘솔에서
python
으로main.py
파일을 실행해 보자.
python main.py
와 같이 파이썬으로 스크립트 파일을 직접 실행했다.- 여기서도
hello.py
파일의__name__
변수에는'hello'
그리고main.py
파일의__name__
변수에는'__main__'
이 들어간다.
- 하지만 다음과 같이
python
으로hello.py
파일을 실행해 보면 결과가 조금 달라진다.
hello.py
파일의__name__
변수에는'hello'
가 아니라'__main__'
이 들어간다.- 즉, 어떤 스크립트 파일이든 파이썬 인터프리터가 최초로 실행한 스크립트 파일의
__name__
에는'__main__'
이 들어간다. - 이는 프로그램의 시작점(Entry Point)이라는 뜻이다.
- 파이썬은 최초로 시작하는 스크립트 파일과 모듈의 차이가 없다.
- 어떤 스크립트 파일이든 시작점도 될 수 있고, 모듈도 될 수 있다.
- 그래서
__name__
변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단한다. if __name__ == "__main__":
처럼__name__
변수의 값이'__main__'
인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다.- 즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도이다.
1) 스크립트 파일로 실행하거나 모듈로 사용하는 코드 만들기
- 그럼 스크립트 파일을 그대로 실행할 수도 있고, 모듈로도 사용할 수 있는 코드를 만들어보자.
- 다음 내용을 프로젝트 폴더 안에
calc.py
파일로 저장한 뒤 실행해 보자.
def add(a, b):
return a + b
def mul(a, b):
return a * b
if __name__ == "__main__":
print(add(10, 20))
print(mul(10, 20))
# 30
# 200
- IDLE에서 실행하거나
python calc.py
와 같이 파이썬 인터프리터로 실행하면10
,20
의 합과 곱이 출력된다. - 즉, 프로그램의 시작점일 때는
if __name__ == "__main__":
아래의 코드가 실행된다.
- 그럼
calc.py
를 모듈로 사용해보기 위해 다음과 같이import
로calc
를 가져와보자.
- 모듈로 가져왔을 때는 아무것도 출력되지 않는다.
- 왜냐하면
__name__
변수의 값이'__main__'
일 때만10
,20
의 합과 곱을 출력하도록 만들었기 때문이다. - 즉, 스크립트 파일을 모듈로 사용할 때는
calc.add
,calc.mul
처럼 함수만 사용하는 것이 목적이므로10
,20
의 합과 곱을 출력하는 코드는 필요가 없다.
- 이때는 다음과 같이
calc.add
와calc.mul
함수에 원하는 값을 넣어서 사용하면 된다.
파이썬은 왜 프로그램의 시작점이 정해져 있지 않나요?
- 파이썬이 처음에 개발될 당시에는 리눅스/유닉스에서 사용하는 스크립트 언어 기반이었기 때문에 프로그램의 시작점이 따로 정해져 있지 않았다.
- 보통 리눅스/유닉스의 스크립트 파일은 파일 한 개로 이루어진 경우가 많은데, 이 스크립트 파일 자체가 하나의 프로그램이다 보니 시작점이 따로 필요하지 않다.
- 하지만 C나 자바같은 언어는 처음 만들어질 때부터 소스 파일을 여러 개 사용했기 때문에 여러 소스 파일의 함수들 중에서도 시작 함수(main)를 따로 정해 놓았다.
7. 패키지 만들기
- 이번에는 패키지를 만들어보자.
- 모듈은 스크립트 파일이 한 개지만 패키지는 폴더(디렉터리)로 구성되어 있다.
- 지금부터 만들 패키지의 폴더 구성은 다음과 같다.
- 먼저 프로젝트 폴더 안에
calcpkg
폴더를 만든다. - 그리고 다음 내용을
calcpkg
폴더 안에__init__.py
파일로 저장한다.
- 폴더 안에
__init__.py
파일이 있으면 해당 폴더는 패키지로 인식된다. - 그리고 기본적으로
__init__.py
파일의 내용은 비워둘 수 있다.
1) 패키지에 모듈 만들기
- 이제
calcpkg
패키지에 모듈을 두 개를 만들자. - 첫 번째 모듈은 덧셈, 곱셈 함수가 들어있는
operation
모듈이고, 두 번째 모듈은 삼각형, 사각형의 넓이 계산 함수가 들어있는geometry
모듈이다.
- 먼저 다음 내용을
calcpkg
폴더 안에operation.py
파일로 저장한다.
- 그리고 다음 내용을
calcpkg
폴더 안에geometry.py
파일로 저장한다.
def triangle_area(base, height):
return base * height / 2
def rectangle_area(width, height):
return width * height
2) 패키지 사용하기
- 이제 스크립트 파일에서 패키지의 모듈을 사용해 보자.
- 다음 내용을 프로젝트 폴더 안에
main.py
파일로 저장한 뒤 실행해 보자.
import calcpkg.operation
import calcpkg.geometry
print(calcpkg.operation.add(10, 20)) # 30
print(calcpkg.operation.mul(10, 20)) # 200
print(calcpkg.geometry.triangle_area(30, 40)) # 600.0
print(calcpkg.geometry.rectangle_area(30, 40)) # 1200
calcpkg
패키지의operation
모듈과geometry
모듈을 가져와서 안에 들어있는 함수를 호출했다.- 이처럼 패키지의 모듈을 가져올 때는
import 패키지.모듈
형식으로 가져온다. - 그리고
패키지.모듈.함수()
형식으로 모듈의 함수를 사용한다.
3) from import
로 패키지의 모듈에서 변수, 함수, 클래스 가져오기
- 물론 패키지의 모듈에서
from import
로 함수(변수, 클래스)를 가져온 뒤 패키지와 모듈 이름을 붙이지 않고 사용할 수도 있다.
- 지금까지 만든
main.py
스크립트 파일과calcpkg
패키지의 계층을 그림으로 나타내면 다음과 같은 모양이 된다.
패키지의 모듈과 __name__
- 패키지의 모듈에서는
__name__
변수에패키지.모듈
형식으로 이름이 들어간다. - 즉,
calcpkg
패키지의geometry.py
에서__name__
의 값이 출력하도록 만들고,import
로 가져오면'calcpkg.geometry'
가 나온다.
모듈과 패키지를 찾는 경로
- 지금까지 모듈과 패키지는 현재 폴더(디렉터리)에 만들었다.
- 파이썬에서는 현재 폴더에 모듈, 패키지가 없으면 다음 경로에서 모듈, 패키지를 찾는다.
>>> import sys
>>> sys.path
['C:\\project',
'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\Lib\\idlelib', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\python36.zip', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\lib', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages']
sys
모듈의path
변수에는 모듈, 패키지를 찾는 경로가 들어있다.- 여기서
site-packages
폴더에는pip
로 설치한 패키지가 들어있다. - 그리고 자기가 만든 모듈, 패키지도
site-packages
폴더에 넣으면 스크립트 파일이 어디에 있든 모듈, 패키지를 사용할 수 있다. - 만약 가상 환경을 만들어서 모듈과 패키지를 관리한다면
가상환경/Lib/site-packages
폴더에 모듈과 패키지가 들어간다.
8. 패키지에서 from import
응용하기
- 지금까지
calcpkg
패키지의 모듈을 가져올 때import calcpkg.operation
처럼import 패키지.모듈
형식으로 가져왔다.
- 만약
import calcpkg
처럼import 패키지
형식으로 패키지만 가져와서 모듈을 사용하고 싶은 경우calcpkg
패키지의__init__.py
파일을 다음과 같이 수정한다.
- 파이썬에서는
__init__.py
파일은 폴더(디렉터리)가 패키지로 인식되도록 하는 역할도 하고, 이름 그대로 패키지를 초기화하는 역할도 한다. - 즉,
import
로 패키지를 가져오면__init__.py
파일이 실행되므로 이 파일에서from . import 모듈
형식으로 현재 패키지에서 모듈을 가져오게 만들어야 한다.
- 이제
main.py
에서import calcpkg
와 같이 패키지만 가져오도록 수정한 뒤 실행해 보자.
import calcpkg
print(calcpkg.operation.add(10, 20)) # 30
print(calcpkg.operation.mul(10, 20)) # 200
print(calcpkg.geometry.triangle_area(30, 40)) # 600.0
print(calcpkg.geometry.rectangle_area(30, 40)) # 1200
calcpkg
의__init__.py
에서 하위 모듈을 함께 가져오게 만들었으므로import calcpkg
로 패키지만 가져와도calcpkg.operation.add(10, 20)
처럼 사용할 수 있다.
1) from import
로 패키지에 속한 모든 변수, 함수, 클래스 가져오기
- 앞에서
from import
문법 중에*
(애스터리스크)를 지정하여 모든 변수, 함수, 클래스를 가져오는 방법이 있었다. - 마찬가지로 패키지에 속한 모든 변수, 함수, 클래스를 가져올 수 있다.
- 먼저
main.py
에서import calcpkg
를from calcpkg import *
와 같이 수정하고, 각 함수들도 앞에 붙은calcpkg.operation
,calcpkg.gemetry
를 삭제한뒤 실행해 보자.
from calcpkg import *
print(add(10, 20))
print(mul(10, 20))
print(triangle_area(30, 40))
print(rectangle_area(30, 40))
# NameError: name 'add' is not defined
- 실행을 해보면
add
가 정의되지 않았다면서 에러가 발생한다. - 왜냐하면
__init__.py
에서 모듈만 가져왔을 뿐 모듈 안의 함수는 가져오지 않았기 때문이다.
- IDLE의 파이썬 프롬프트에서
dir
함수를 호출하여 현재 네임스페이스를 확인해 보자.
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'geometry', 'operation']
- 현재 네임스페이스에는
operation
,geometry
만 들어있어서add
,mul
처럼 함수 이름만으로는 호출할 수가 없다. - 이때는
__init__.py
에서 모듈 안의 함수를 가져오게 만들어야 한다. - 특히 현재 패키지(
calcpkg
)라는 것을 명확하게 나타내기 위해 모듈 앞에.
(점)을 붙인다.
- 이제
main.py
파일을 실행해 보면 결과도 잘 출력되고,add
,mul
,triangle_area
처럼 함수 이름 그대로 호출할 수 있다.
- 물론
__init__.py
파일에서 특정 함수(변수, 클래스)를 지정하지 않고*
를 사용해서 모든 함수(변수, 클래스)를 가져와도 상관없다.
- 이렇게 패키지의
__init__.py
에서from .모듈 import 변수, 함수, 클래스
또는from .모듈 import *
형식으로 작성했다면 패키지를 가져오는 스크립트에서는패키지.함수()
형식으로 사용할 수 있다. - 이때는
import calcpkg
와 같이 패키지만 가져오면 된다.
import calcpkg
print(calcpkg.add(10, 20)) # 30
print(calcpkg.mul(10, 20)) # 200
print(calcpkg.triangle_area(30, 40)) # 600.0
print(calcpkg.rectangle_area(30, 40)) # 1200
__init__.py
에서from .모듈 import 변수, 함수, 클래스
또는from .모듈 import *
형식으로 모듈을 가져오면calcpkg
패키지의 네임스페이스에는add
,mul
,triangle_area
,rectangle_area
가 들어간다.- 따라서 모듈을 거치지 않고
calcpkg.add
처럼 패키지에서 함수를 바로 사용할 수 있다.
__all__
로 필요한 것만 공개하기
- 패키지의
__init__.py
에서from .모듈 import *로 모든 변수, 함수, 클래스
를 가져오면 패키지 외부에 공개하고 싶지 않은 것까지 공개하게 된다. - 이때는
__all__
에 공개할 모듈, 변수, 함수, 클래스를 리스트 형태로 지정해 주면 된다.
하위 패키지 사용하기
- 파이썬의 패키지는 패키지 안에 하위 패키지를 만들 수 있다.
- 즉, 패키지 안에 폴더(디렉터리)를 만들고
__init__.py
와 모듈을 넣으면 하위 패키지가 된다.
- 예를 들어서 다음과 같이
calcpkg
안에operation
과geometry
하위 패키지가 있고, 그 아래에 모듈이 들어있다. import
로 하위 패키지의 모듈을 가져올 때는 계층 순서대로.
(점)을 붙여서 가져오면 된다.
- 즉,
import calcpkg.operation.element
와 같은 식이며, 만약import calcpkg
처럼 패키지만 가져와서 사용하고 싶다면calcpkg/__init__.py
에서 하위 패키지의 모듈에 들어있는 변수, 함수, 클래스를 모두 가져오게 만들면 된다.
from .operation.element import *
from .operation.logic import *
from .geometry.shape import *
from .geometry.vector import *
- 이렇게 하면
calcpkg.add(10, 20)
,calcpkg.triangle_area(30, 40)
또는add(10, 20)
,triangle_area(30, 40)
처럼 사용할 수 있다.
- 참고로 하위 패키지 안에서 옆에 있는 패키지의 요소를 가져와서 사용하려면
..
을 사용해야 한다. ..
은 상위 폴더(디렉터리)라는 뜻이며..패키지
또는..모듈
은 상위 폴더에 있는 패키지, 모듈이라는 뜻이다.- 즉, 패키지와 같은 계층의 패키지 또는 모듈이고
...
은 상위 폴더의 상위 폴더라는 뜻이며 위로 갈수록.
이 하나씩 늘어난다.
- 예를 들어
calcpkg/geometry/shape.py
에서 옆에 있는calcpkg/operation
패키지의element
모듈을 사용한다면 다음과 같이from ..operation import element
로 지정해 준다. - 또는,
from ..operation.element import mul
과 같이 지정하면mul
을 함수 그대로 사용할 수 있다.
from ..operation import element
def triangle_area(base, height):
return element.mul(base, height) / 2
def rectangle_area(width, height):
return element.mul(width, height)
모듈과 패키지의 독스트링
- 모듈의 독스트링은 모듈 파일의 첫 줄에
""" """
(큰따옴표 세 개) 또는''' '''
(작은따옴표 세 개)를 사용하여 문자열을 넣는다.
- 패키지의 독스트링은
__init__.py
파일의 첫 줄에""" """
(큰따옴표 세 개) 또는''' '''
(작은따옴표 세 개)를 사용하여 문자열을 넣는다.
- 모듈과 패키지의 독스트링을 출력하려면 모듈 또는 패키지의
__doc__
을 출력하면 된다.
References
- https://dojang.io/mod/page/view.php?id=2441
- https://dojang.io/mod/page/view.php?id=2442
- https://dojang.io/mod/page/view.php?id=2443
- https://dojang.io/mod/page/view.php?id=2447
- https://dojang.io/mod/page/view.php?id=2448
- https://dojang.io/mod/page/view.php?id=2449
- https://dojang.io/mod/page/view.php?id=2450