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('지름이 {}인 원의 면적은 {}입니다.\n'.format(x, area.circle(x)))

        y = float(input('정사각형의 변의 길이를 입력해 주세요: '))
        print('변의 길이가 {}인 정사각형의 면적은 {}입니다.'.format(y, area.square(y)))

if __name__ == '__main__':
    main()

2. 패키지

01. 패키지란?

  • 모듈의 묶음
  • 프로그램의 구성요소를 쉽게 재활용할 수 있도록

02. 패키지 만들기

  1. 프로젝트 폴더 안에 Directory 를 만들고, 해당 Directory 에 모듈들을 넣기
  2. 폴더 안에 __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 <module> import *를 하면 모듈의 모든 내용이 임포트됩니다.

하지만 모듈 대신 패키지에 from <package> 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 모듈의 모든 내용이 임포트되지 않고 circlesquare 함수만 임포트됩니다.

__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 * 

댓글

Designed by JB FACTORY