Python Basics - Modules & Packages

jhwang·2022년 5월 2일
0

18. Modules & Packages


18-1. Modules

  • Module:: 변수, 함수, class 등을 모아놓은 파일

  • 코드를 분리하고 공유할 수 있도록 만들어주는 문법

  • 다른 파일에서 재사용이 가능하게 하기 위함

  • 전체 코드가 한 파일에 넣기 너무 커졌을 때 여러 파일로 나누어 정리하기 위함

ex) len()

my_list = [1, 2, 3, 4, 5]
my_list_length = len(my_list)

print(my_list_length)
  • 파이썬에서 이미 모듈로 구현해놨기 때문에 그냥 가져다 쓰면 됨
  • 이처럼 모듈은 다른 사람들이 이미 만들어놓은 모듈을 사용할 수도,
    직접 만들어서 사용할 수도 있음


18-1-1. Module 만들기

  1. 파일을 만들고, 그 안에 재사용하고 싶은 함수나 클래스, 변수 등을 구현하면됨
## my_module.py
my_module_var = 7

def my_module_func():
    return "Hello!"

class MyModuleClass:
    pass
  1. 그 후 다른 파일에서 import 키워드를 사용하여 불러와서 사용
import <모듈 이름>

import my_module

📌::: 모듈을 import할 때 파일 확장자인 .py제외하고 파일 이름만을 사용!!!

  1. 원하는 모듈을 import한 후, 모듈의 원하는 변수/함수/클래스를 사용
<모듈 이름>.<모듈에서 사용하길 원하는 변수/함수/클래스 이름>

my_module.my_module_func()

정리하면,

## main.py
import my_module

print(my_module.my_module_var)

my_module.my_module_func()

my_module_class = my_module.MyModuleClass()


18-1-2. Alternative ways to import modules

  • from ... import ...
from <모듈 이름> import <함수/변수/클래스1>, <함수/변수/클래스2>, ..., <함수/변수/클래스N>
from my_module import my_module_func, my_module_var

print(my_module_var)
my_module_func()
  • *(모듈의 모든 요소 import)
from my_module import *

print(my_module_var)
my_module_func()

하지만, 권장되는 방법은 아님
local scope를 가지고 있는 다른 변수/함수/클래스와 이름 충돌이 생기는 경우 알기가 쉽지 않을 수 있음

18-1-3. Import As

  • import as 키워드를 통해 새로운 이름을 부여

    	- 여러 모듈을 import하는 경우 이름충돌이 발생할 수 있음
    	- 혹은 원하는 모듈의 요소 이름이 너무 긴 경우
from my_module  import my_func as f1
from my_module2 import my_func as f2
from my_module3 import function_with_name_too_long as f3

f1()
f2()
f3()


<<module 이름도 as를 통하여 새로운 이름 부여 가능>>

import my_module as m1

m1.my_module_func()



18-2. Packages

  • Module을 디렉토리형식으로 구조화

  • 도트(. ,(dot notation)를 사용해서 파이썬 모듈을 디렉터리 구조로 관리

import pkg.mod1
from pkg.mod2 import func2

pkg.mod1.func2()
func2()


18-2-1. Package Initialization

::: __init__

  • __init__.py 용도

    • 해당 디렉터리가 패키지의 일부임을 알려주는 역할

    • import할 때 경로의 총 길이 줄여줌

    • package에서 import할 수 있는 변수/함수/클래슷 제한

    • 그 외 package가 import될 때 꼭 먼저 실행되어야 하는 코드

    • 만약 여러 이름의 패키지에 포함된 디렉터리에 __init.py__ 파일이 없다면 패키지로 인식 X

📌 ::: 패키지 안에 각 디렉토리에는 반드시 __init__.py가 존재해야함
📌 ::: __init__.py 파일은 비어있을 수 있고, 패키지 내 포함된 모듈들의 정보를 제공

※ python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.

::: Examples
🎯 ::: import할 때 경로의 총 길이 줄여주는 예제

import pkg.mod1

pkg.mod1.func2()

⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣⇣

# __init__.py
from .mod1 import func2

# main.py
from pkg import func2

func2()

<<매번 모든 경로를 입력해야 하는 대신 __init__.py를 통해 경로를 줄여줌>


🎯 ::: import할 수 있는 변수/함수/클래스 제한

  • package 외부에서 원하지 않는 함수가 import되는 것을 막기위해 사용
  • __all__ 변수를 지정
  • package를 통해 import 될 수 있는 요소들은 모두 __all__ 통해 정의
  • __all__의 default값은 모든 함수/변수/클래스
    따라서, __all__ 변수를 정의해 줌으로써 import될 수 있는 요소를 제한
# __init__.py
from .mod1 import func2
from .mod2 import func3

__all__ = ['func2', 'func3']

# main.py
from pkg import *

func2()
func3()
func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.

18-2-2. 다른 사람 package 사용하기

  • pip 툴 사용, pip는 파이썬의 package manager
pip install Django

REFERENCE

https://losskatsu.github.io/programming/function-module-package/#2-%EB%AA%A8%EB%93%88

profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글