강의정보 (인프런 - 프로그래밍 시작하기: 파이썬 입문(Inflearn Original))

  • Chapter06-3
  • Python Package

1. Directory

sub
├── __init__.py
├── sub1
│   ├── __init__.py
│   └── module1.py
└── sub2
    ├── __init__.py
    └── module2.py


2. Python Files

# sub/__init__.py
# sub/sub1/__init__.py

__all__ = ['module1']
# sub/sub1/module1.py

import sys
import inspect


def mod1_test1():
	print ("Module1 -> Test1")
	print("Path : ", inspect.getfile(inspect.currentframe()))	 # 현재 실행파일의 파일 위치 출력

def mod1_test2():
	print ("Module1 -> Test2")
	print("Path : ", inspect.getfile(inspect.currentframe()))
# sub/sub2/__init__.py

__all__ = ['module2']
# sub/sub2/module2.py

import sys
import inspect

def mod2_test1():
	print ("Module2 -> Test1")
	print("Path : ", inspect.getfile(inspect.currentframe()))

def mod2_test2():
	print ("Module2 -> Test2")
	print("Path : ", inspect.getfile(inspect.currentframe()))


3. __init__.py 용도

  • __init__.py 파일: 해당 directory가 패키지의 일부임을 알려주는 역할
  • Python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다
  • 하지만 하위 버전과의 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법!
  • __all__
    • __all__ 변수에 정의된 모듈만 import 가능
    • 따라서, import를 하지 않아야 하는 즉, 외부에서 접근하면 안되는 (ex. 버그를 발생시키는 모듈) 모듈은 __all__ 변수에서 제외시킨다!


4. Examples

Example 1: import ~

import sub.sub1.module1
import sub.sub2.module2


# 사용
sub.sub1.module1.mod1_test1()
sub.sub1.module1.mod1_test2()

sub.sub2.module2.mod2_test1()
sub.sub2.module2.mod2_test2()
--------------------------------------------------
Module1 -> Test1
Path :  /Users/jinsolkim/Desktop/practice/sub/sub1/module1.py
Module1 -> Test2
Path :  /Users/jinsolkim/Desktop/practice/sub/sub1/module1.py
Module2 -> Test1
Path :  /Users/jinsolkim/Desktop/practice/sub/sub2/module2.py
Module2 -> Test2
Path :  /Users/jinsolkim/Desktop/practice/sub/sub2/module2.py

Example 2: from ~ import ~

from sub.sub1 import module1
from sub.sub2 import module2 as m2  # alias


module1.mod1_test1()
module1.mod1_test2()

m2.mod2_test1()
m2.mod2_test2()
--------------------------------------------------
Module1 -> Test1
Path :  /Users/jinsolkim/Desktop/practice/sub/sub1/module1.py
Module1 -> Test2
Path :  /Users/jinsolkim/Desktop/practice/sub/sub1/module1.py
Module2 -> Test1
Path :  /Users/jinsolkim/Desktop/practice/sub/sub2/module2.py
Module2 -> Test2
Path :  /Users/jinsolkim/Desktop/practice/sub/sub2/module2.py

Example 3: from ~ import *

  • asterisk(*)는 웬만하면 쓰지말자
  • 사용하지도 않을 파일/함수까지 모두 가져와서 파이썬이 실행될때 굳이 불필요한 작업을 할 필요가 없다. 메모리만 잡아먹는다
from sub.sub1 import *
from sub.sub2 import *


module1.mod1_test1()
module1.mod1_test2()

module2.mod2_test1()
module2.mod2_test2()
--------------------------------------------------
Module1 -> Test1
Path :  /Users/jinsolkim/Desktop/practice/sub/sub1/module1.py
Module1 -> Test2
Path :  /Users/jinsolkim/Desktop/practice/sub/sub1/module1.py
Module2 -> Test1
Path :  /Users/jinsolkim/Desktop/practice/sub/sub2/module2.py
Module2 -> Test2
Path :  /Users/jinsolkim/Desktop/practice/sub/sub2/module2.py


Reference


Leave a comment