Dev/Python

[Python 기초] Module & Package 이해하기 4(실습)

sincerely10 2020. 6. 27. 18:24
반응형

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

Python Module & Package 이해하기의 네 번째 포스트 입니다.
이번 포스트에서는 패키지를 직접 만들어 보는 과정을 포스트 합니다.

포스트 항목은 다음과 같습니다.
1. 만드는 패키지 안내
2. 파일안내
3. import error 찾기
4. Absolute Path 또는 Relative Path로 import 하기

 

1. 만드는 패키지 안내

만들고자 하는 패키지는 calculator(계산기) 입니다.
파일구조는 다음과 같습니다.

calculator 패키지의 파일구조

저는 VSCode 환경에서 작성하겠습니다.
Python Version: 3.7.7

2. 파일 안내

각 파일의 내용은 하단과 같습니다.

# calc/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))
# calc/calculator/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)

 

# calc/calculator/multiplication.py
def multiply(a,b):
    return(a*b)

VSCode로 보면 아래와 같습니다.

3. import error 찾기

이 실습에 에러를 찾고 이를 개선하는 미션도 함께 있습니다.

Q. main.py에 상대경로로 add_and_multiply 함수를 import 했을 때, 발생하는 에러의 확인

A. 

에러 로그는 다음과 같습니다.
'Attempted relative import beyond top-level package'

-> top-level을 패키지를 넘어 상대경로 import를 시도했습니다.

Python 공식 홈페이지에 위 에러에 대한 원인을 확인할 수 있습니다.

Note that relative imports are based on the name of the current module. Since the name of the main module is always "__main__", modules intended for use as the main module of a Python application must always use absolute imports.

-> 상대경로로 import 시 현재 module의 이름을 기반으로 합니다. main 모듈의 이름은 항상 "__main__"이기 때문에, 파이썬 어플리케이션은 항상 절대경로를 사용해야 합니다.

위 문구처럼 calculator 파일구조에서 main은 package에 속한 파일이 아닙니다. 그렇기 때문에 main.py가 속한 module은 '__main__'이 되는 것입니다.
결국 절대경로로 calculator package를 바라 봐줘야 합니다.

따라서 다음과 같이 수정했습니다.

from calculator.add_and_multiply import add_and_multiply

 

4. Absolute Path & Relative Path로 import 하기

이번에는 add_and_multiply.py 파일 입니다.
multiply 함수에 대해 Absolute Path(절대경로)와 Relative Path(상대경로)로 import 해보겠습니다.

상대경로는 이미 구현되어 있습니다.

# calc/calculator/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)

같은 directory인 calculator에서 multiplication.py의 multiply 함수를 import 했습니다.

다음으로는 절대경로를 구현해보겠습니다.

# calc/calculator/add_and_multiply.py
# Relative Path
#from .multiplication import multiply

# Absolute Path
from calculator.multiplication import multiply

# from calculator.multiplication import multiply
def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

calculator라는 directory는 calc라는 프로젝트 아래있는 Package 입니다.
따라서 절대경로로 calc를 생략하고
from calculator.multiplication import multiply
의 형태로 import 할 수 있습니다.

이 부분이 3번의 main module과의 차이점입니다.
main.py는 같은 프로젝트 안에 있지만, 같은 package가 아니기 때문에 상대경로로 접근해 import 할 수 없습니다.

반면, add_and_multiply.py 파일은 같은 프로젝트 이면서 같은 package 입니다.
따라서 절대경로와 상대경로 모두 가능합니다.

에러 수정과 함수 확인을 통해 함수를 수행 하였고 정상 결과가 출력됨을 확인하였습니다.

반응형