TIL DAY.13 Python- How Import Statement Finds Modules & Packages

Dan·2020년 8월 25일
0
post-thumbnail

Assignment
이번 과제는 코딩 과제가 아니라 서술형 과제입니다. 다음 문제들을 읽으시고 답을 블로깅 한후 슬랙 채널에 공유해주세요.

  1. sys.modules 와 sys.path의 차이점을 서술해 주세요.

*sys.modules
-파이썬이나 모듈이나 package를 찾기 위해 가장 먼저 확인하는 곳 입니다.
-단순한 dictionary
-이미 import된 모듈과 packages들을 저장하고 있습니다.

sys.path
-마지막으로 보는 장소
-기본적으로 list 이며 string 요소들을 가지고 있습니다
-파이썬은 list의 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인합니다.

  1. sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?

sys 는 이미 파이썬에 포함되어 있는 모듈이므로 sys모듈을 import해서 sys.modules와 sys.path를 출력할수도 있고 수정 할 수도 있습니다.
예를 들면 파이썬은 import 하고 하는 모듈과 package를 찾을 때 먼저 sys.modulues를 보고,없으면 파이썬 built-in을 확인하고 마지막으로 sys.path를 확인합니다. 이때 sys.path에서도 찾이 못하면 ModuleNotFoundError에러를 리턴합니다.

  1. Absolute path와 relative path의 차이점을 서술해 주세요.

Absolute path는 절대 경로 입니다. import를 하는 파일이나 경로에 상관 없이 항상 경로가 동일하기 때문입니다.

Relative path는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import하는 위치를 기준으로 경로를 정의합니다. 그래서 일반적으로 relative path는 local package안에서 다른 local package를 import 할 때 사용됩니다.

  1. 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

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

multiplication.py

def multiply(a,b):
return(a*b)

  1. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고
    다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.
    https://docs.python.org/3/tutorial/modules.html#intra-package-references
  • 위와 같이 에러가 뜨는데 relativ path 를 주석처리하고 absolute path를 활성화 시키니깐 정답이 5가 나왔습니다.
  • 위와 같은 에러가 뜨는 이유는 main.py 디렉토리은 calculator이라는 최상위 패키지안에 있습니다. #relative path
    from .calculator.add_and_multiply import add_and_multiply 는 .을 사용하여 relative path를 선언했지만 calculator이 이미 최상위 패키지 이기 때문에 절대 경로를 사용하여 에러를 해결할 수 있습니다.
  1. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.

상대경로로 import 할 때, main.py에서 발생한 것과 같은 에러가 뜹니다. 마찬가지로 main module인 add_and_multiply 모듈의 위치를 잡지 못해 발생하는 에러입니다.

  1. init.py 파일의 역할에 대해서도 정리해서 블로깅 해주세요.

int.py 는 파일이 존재하는 디렉터리는 패키지의 일부임을 알려주는 역할을 합니다. 따라서 int.py라는 파일이 없는 디렉터리는 패캐지로 인식되지 않는다.

profile
만들고 싶은게 많은 개발자

0개의 댓글