Python 12 Module

김민호·2021년 9월 6일
0

Python

목록 보기
13/16

모듈(Module)

개념

  • 모듈 : 변수나 함수 그리고 클래스 등을 모아놓은 파일
  • 모듈을 만들어놓음으로써 다른 파일에서 재사용 가능, 유지보수 용이

만들기

  • 파일을 만들고 그 안에 재사용하고 싶은 함수, 클래스, 변수 등을 구현하면 끝
  • 확장자는 .py 이어야 함
  • my_module이라는 모듈을 만들고 그 안에 변수, 함수, 클래스를 담아서 저장했다

사용

  • 사용할 때 : import <모듈이름> ex) import my_module
    이렇게 모듈을 불러왔다면 이제 사용하고 싶은 변수/함수/클래스를 사용할 수 있음
    <모듈이름>.<변수/함수/클래스> ex) my_module.

  • 이렇게 만들어놓은 모듈을 임포트해오면 그 안에 구현해놓은 것들을 쓸 수 있음
  • pracprac에서 my_module_func()라는 함수를 정의한 적이 없지만 모듈파일에서 구현해놓았기 때문에 바로 리턴값이 나오는 것을 확인할 수 있음
  • from <모듈이름> import <변수/함수/클래스>, ... 를 하면 모듈 이름을 붙이지 않고 바로 원하는 요소를 호출할 수 있음
    ex) from my_module import my_module_func

  • from <모듈이름> import * : 해당 모듈의 모든 요소가 곧바로 import

불러온 모듈의 요소의 이름을 바꾸고 싶을 때

from <모듈이름> import <변수/함수/클래스> as <바꿀이름>

  • 모듈 이름도 변경 가능 import <모듈이름> as <바꿀이름>

패키지(Package)

개념

  • 패키지도 모듈과 똑같은 개념이지만, 여러 파이썬 모듈들이 모여진 것이 패키지
  • 모듈처럼 import해서 사용
import pkg.mod1
from pkg.mod2 import func2


pkg.mod1.func2()
func2()

__init__

  • __init__ : 이 파일을 통해 package 초기 설정을 해줌
  • package 안에 __init__이 파일이 있으면 package가 import 될때 __init__파일의 코드들이 자동으로 실행
  • __init__.py 의 역할
    • import할때 경로의 총 길이 줄여주기
    • package에서 import할 수 있는 변수/함수/클래스 제한하기
    • 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들

1) mport할때 경로의 총 길이 줄여주기

위의 그림에서 pkg의 mod1의 func2라는 함수를 import하여 사용하기 위해서 아래와 같이 경로를 번거롭게 다 타입해줘야 함

import pkg.md1

pkg.mod1.func2()

이를 간단히 하는 방법은 원하는 요소를 __init__.py에 먼저 한 번 import해주면 됨

#`__init__.py`
from .mod1 import func2

func2()

2) package에서 import할 수 있는 변수/함수/클래스 제한하기

  • __all__ 변수 : package를 통해 import 될 수 있는 요소들은 모두 __all__ 변수를 통해 정의됨. dafault 값은 모든 함수/변수/클래스
    __all__ = string을 값으로 하는 요소를 가지고 있는 list
#`__init__.py`
from .mod1 import func2
from .mod2 import func2

__all__ = ['func2', 'func3']

func2()

이렇게 하면 정의된 func2와 func3 함수만 import 될 수 있고 이 외의 모든 함수는 import 될 수 없음

Django

  • 파이썬으로 작성된 오픈 소스 웹 프레임워크. package
  • 설치 방법 : 터미널에서 pip install Django

Import Search 순서

파이썬이 모듈/package를 찾는 순서

  1. sys.modules
  • 파이썬이 가장 먼저 확인하는 곳
  • 단순한 dictionary이고 이미 import된 모듈/package를 저장하고 있음
  • 새로 import하는 모듈은 여기서 찾을 수 없음
  1. built-in modules
  • 파이썬에서 제공하는 공식 라이브러리들
  • 이미 파이썬에 포함되어 있는 모듈들
  1. sys.path
  • 가장 마지막으로 보는 장소
  • string 요소들을 가지고 있는 List 형태
  • 각 string 요소들은 경로를 나타냄
  • sys는 파이썬에 포함되어 있는 모듈
  1. 위 3개 에서도 못찾으면 ModuleNotFoundError 리턴

Absolute Path & Relative Path

  • 직접 개발한 local package를 import 할 때는 해당 package의 위치에 맞게 import 경로를 잘 선언해야 함

Absolute Path

  • import를 하는 파일이나 경로에 상관없이 항상 경로가 동일
└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py 
        ├── module4.py
        └── subpackage1
            └── module5.py 

예를 들어 🔴의 function2 함수를 import 하는 과정을 파이썬 형식으로 표현하면,

my_app.package2.subpackage1.module5.py

이고, 이미 my_app 프로젝트 안에 있기 때문에 이건 생략

package2.subpackage1.module5.py

from, import 키워드를 사용해서 정리하면

from package2.subpackage1.module5.py import function2

my_app 프로젝트 내에서는 어느 위치에서라도 function2를 import하기 위해서 위와 도일한 경로를 가지게 됨. absolute path는 current directory로부터 경로를 시작. local package를 import 할 때 사용. 경로가 길어질 수 있는 단점

Relative Path

  • import 하는 위치를 기준으로 경로를 정의함
  • 일반적으로 local package 안에서 다른 local package를 Import 할 때 사용
└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py 🔵
        ├── module4.py
        └── subpackage1
            └── module5.py 🟢
  • 현재 위치는 package2/module3.py 라고 가정

  • package2의 module3에서 같은 곳인 package2의 class1을 import
    👉🏼 from . import class1
    여기서 dot(.)은 import가 선언되는 파일의 현재 위치

  • package2의 subpackage1의 module5dml function2 함수를 import
    👉🏼 from .subpackage1.module5 import function2

  • dot 2개(..)는 현재 위치에서 상위 디렉토리로 가는 경로

# subpackage1/module5.py
from ..module4 import class4

결론

상대 경로는 길이는 줄여줄 수 있지만 파일 위치가 변경되면 그에 따라 경로 위치도 변경되어야 해서 혼란을 야기할 수 있으므로 절대 경로 사용 권장

profile
개발자로서의 삶은 https://velog.io/@maxminos 에서 기록하고 있습니다 😀

0개의 댓글