Dev/Python

[Python 기초] Module & Package 이해하기 2

sincerely10 2020. 6. 27. 13:35
반응형

<Module & Package 이해하기 Series>
[Python 기초] Module & Package 이해하기 1(Module)
[Python 기초] Module & Package 이해하기 2(Package)
[Python 기초] Module & Package 이해하기 3(import 순서)
[Python 기초] Module & Package 이해하기 4(실습)

지난 포스트에 이어서 진행하겠습니다.
이 포스트에는 Package에 대한 내용을 함께 다루겠습니다.

포스트 항목은 다음과 같습니다.
1. Package 이해하기
2. Package Initialization(패키지 초기화하기)

 

1. Package 이해하기

module은 하나의 python 파일이었습니다.
어떤 module은 너무 커서 한 파일에 다 넣기에 비효율적일 수 있습니다.
이러한 경우 여러 파일에 코드를 나누는 것이 효율적일 것입니다.
나뉘어진 코드들을 하나의 module로 불러와 사용할 수 있도록 해주는 것이 Package 입니다.

<Package의 파일구조 예시>

이런 경우에 같은 Directory에 있는 mod1.py 파일과 mod2.py 파일이 동일한 package에 속한 것입니다.
즉, pkg라는 패키지를 모듈로 불러온다면, mod1.py 파일과 mod2.py 파일을 불러온 것입니다.

차이점이 있다면, 클래스 객체와 같이 .(dot notation)으로 원하는 module을 import 한다는 점 입니다.
아래 코드와 같이 package import를 사용할 수 있습니다.

import pkg.mod1
from pkg.mod2 import func2

pkg.mod1.func2()
func2()

2. Package Initialization(패키지 초기화하기)

package가 import 될 때, 초기 설정을 해줘야 할 때가 있습니다.
Python은 __init__.py 파일로 초기설정을 할 수 있습니다.

package에 __init__.py 파일이 있으면 package가 import 될 때, __init__.py 파일이 자동으로 실행 됩니다.
__init__.py가 어떤역할을 하는 걸까요?

  • import할 때, 경로의 총 길이 줄여주기
  • Package에서 import 할 수 있는 변수/함수/클래스 제한하기
  • Package가 import 될 때, 꼭 먼저 실행될 코드를 실행

하나씩 살펴보겠습니다.

2.1 import 할 때, 경로의 총 길이 줄여주기

코드로 확인해보겠습니다.

#main.py
import pkg.mod1

pkg.mod1.func2()

func2를 사용할 때마다,  package의 name station을 적어준다는 것은 번거로운 일입니다.
__init__.py가 복잡한 과정을 줄여줄 수 있습니다.

# __init__.py
from .mod1 import func2

__init__.py 파일에서 먼저 import를 합니다.
이 과정으로 main.py(func2 함수를 사용하는 곳)에서 사용하려는 함수를 package의 import 후
비교적 짧게 선언할 수 있습니다.

# main.py
from pkg import func2

func2()

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

모듈 내에서도 노출 하지 않아야 할 혹은 원하지 않는 변수/함수/클래스가 있을 수 있습니다.
이 때, __init__.py 파일에서 __all__ 변수로 제어할 수 있습니다.

Package를 통해 import 될 수 있는 요소들은 전부 다 __all__ 변수를 통해 정의 됩니다.
__all__ 변수는 string Value로 구성된 list 입니다.
그리고 특별한 정의가 없으면, 이 값은 사용할 수 있는 모든 변수/함수/클래스를 default로 갖고 있습니다.

예제 코드를 통해 확인해보겠습니다.

# __init__.py
from .mod1 import func2
from .mod2 import func3

__all__ = ['func2', 'func3']

위 코드와 같이 __init__.py 파일에서 mod1.py와 mod2.py의 func2와 func3에 대해서만 import를 할 수 있게 설정 했습니다.

main.py 파일을 보면,

# main.py
from pkg import *

func2()
func3()
func4()

func4 함수는 별도의 허가가 없었습니다.
따라서 함수를 찾지 못 할 것입니다.

 

반응형