Assignment: How import statement finds modules and packages

signet·2021년 1월 20일
0
  1. sys.modules와 sys.path의 차이점
    sys.modules는 module이나 package를 찾는 일에 있어서 가장 우선적으로 확인하는 곳으로, 이미 import된 module과 package를 저장하고 있다. 형식은 '{모듈이름:모듈경로}'의 dictionary로 저장되어 있다. 최소한 한번은 import되어야 이곳에 저장이 되며, 새로 import하는 경우 이곳에서 감지하지 않는다.
    sys.path는 가장 마지막에 확인하는 곳으로, 형식은 ['모듈경로']의 list로 저장되어 있다. 이처럼 둘은 자료형, 찾는 순서에 있어서 차이가 있다.

  2. 파이선이 sys 모듈을 어떻게 찾는가?
    sys 모듈은 built-in module로 파이선에 기본적으로 포함되어 있는 모듈이다. 그렇기 때문에 sys.module을 찾은 뒤 built-in 모듈에서 찾아 사용하게 된다.

  3. Absolute path와 relative path의 차이점을 서술해 주세요.
    Absolute path는 최상위 디렉토리 기준으로 패키지와 모듈이 존재하는 경로를 나타낸 것이고, relative path는 import를 하려고 하는 현재 위치를 기준으로 경로를 나타낸 것이다. 그래서 전자는 어디에서 import하려하던 동일한 경로명을 가지지만, 후자는 기준이 되는 디렉토리가 바뀌기 때문에 같은 패키지나 모듈이어도 경로명이 바뀔 수 밖에 없다. 특히 후자의 경우, 파일 위치가 변경되면 경로명을 모두 수정해주어야 하기 때문에, 절대 경로명을 사용하는 것이 보편적이다.

  4. calculator 만들기
    다음과 같이 vscode를 이용하였다.

  5. 에러 해석
    터미널에서 작동시킬시 ImportError: attempted relative import with no known parent package 를 반환한다. 공식 문서를 확인할 경우, 메인 모델에서는 반드시 절대 경로로 import를 해야 한다는 사실을 알 수 있다. 이에 따라 수정할 경우

    5를 반환 하는 것을 알 수 있다.

  6. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트
    두 경로 모두 정상적으로 작동하는 것을 확인 할 수 있었다. 앞서 살펴본 main의 경우 import하려는 package보다 상위 경로에 있었기에 절대경로로만 import할 수 있었으나, 이번 문제의 경우 import하려는 package와 import당하는 package가 동일 선상에 있기 때문에 상대 경로로도 정상적으로 import되는 것을 알 수 있다.

  7. __init__.py의 역할
    이것은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 하는데, 하위버전과의 호환을 위해 입력해주는 것이 안전하다. 이때, 해당 디렉토리의 모든 모듈을 import하기 위해 * 을 사용하는 경우, __all__변수를 이용해 선언을 해줄 필요가 있다.

0개의 댓글