모듈과 패키지 #2

chaerin·2021년 1월 19일
0

PYTHON

목록 보기
17/17

calculator 패키지 만들기

다음과 같은 디렉토리 구조를 형성한다.

⚡️ init.py 파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.

  • main.py
# absoulte path
#from calculator.add_and_multiply import add_and_multiply 

# relative path
from .calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))
  • add_and_multiply.py
from .multiplication import multiply
# from calculator.multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
  • multiplication.py
def multiply(a,b):
    return(a*b)

main.py에서 상대경로로 add_and_multiply를 임포트했을 때 발생하는 에러 확인

✔️ main.py에서 상대경로로 add_and_multiply 를 임포트하면 다음과 같은 에러가 발생한다.

ImportError: attempted relative import with no known parent package

✔️ 에러가 발생하는 이유는 파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대경로로 임포트를 사용해야 한다.

# absoulte path
#from calculator.add_and_multiply import add_and_multiply 

# relative path
from calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))

add_and_multiply.py에서 multiply 함수를 절대경로와 상대경로로 각각 임포트 해보고 main 모듈과 차이점 확인

  • 절대경로로 임포트 했을 시
from .multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

부모패키지가 없이 상대경로 import를 실행한다는 오류가 출력된다.

ImportError: attempted relative import with no known parent package
  • 상대경로로 임포트 했을 시
from calculator.multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

패키지를 인식하지 못한다.

ModuleNotFoundError: No module named 'calculator'

✔️ main 모듈과의 차이점
name 변수를 확인하는 조건문이 있어서 main 모듈을 실행할 때는 name 변수의 조건문이 이를 만족시켜 print 함수를 실행시킨다. 따라서 add_and_multiply.py 모듈은 절대경로와 상대경로 모두 정상적으로 작동이 가능하다.

init.py 파일의 역할

✔️ __init__.py 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.

패키지에 포함된 디렉토리에 __init__.py파일이 없다면 패키지로 인식되지 않는다.

✔️ __init__.py 파일에 __all__ 변수를 설정함으로써 특정 디렉토리의 모듈을 *을 사용하여 import할 때 import할 수 있는 모듈을 정의해 줄 수 있다.

ex)

# C:/doit/game/sound/__init__.py
__all__ = ['echo']

0개의 댓글