Import statement 가 module & package를 어떻게 찾는지 정리

Jae Hoon Shin, 신재훈, Noah·2020년 10월 27일
0

이 자료는 TIL day 9 (Oct 28)과 중복될 수 있습니다.

Assignment

1. sys.modules 와 sys.path의 차이점을 서술해 주세요.
sys.modules 은
파이썬이 모듈이나 package를 찾기 위해 제일 먼저 확인하는 곳
단순한 dictionary,
이미 import된 모듈과 package들을 저장하고 있다.(한번 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 되는기능)
therefore, 새로 import하는 모듈은 sys.modules 에서 못 찾음

sys.path는
마지막으로 찾는 장소
기본적으로 list이며 string요소를 가지고 있는 list
마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾습니다.
sys.path 에서도 못찾으면 ModuleNotFoundError 에러를 리턴합니다.

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

sys 모듈은 이미 built-in 되어 있기 때문에 built-in-module이 있는 부분에서 찾게됩니다.

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

프로젝트 내에서는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 위와 같이 동일하게 되므로 absolute path 라고 하는 것입니다.

참고로 current directory 라고 하는 현재의 프로젝트 디렉토리는 default로 sys.path 에 포함되게 됩니다.
그러므로 absolute path는 current directory 로 부터 경로를 시작하게 되는것입니다.
일반적으로 local package를 import 할때는 absolute path를 사용하면 됩니다.

다만 absolute path를 사용하게 되면 경로가 너무 길어질 수 있습니다.
Relative path는 선언해야 하는 경로의 길이를 줄여주지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있습니다.
그러므로 웬만한 경우 absolute path를 사용하는게 권장 됩니다.

4. calculator 패키지 만들기

5. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고
다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.

https://docs.python.org/3/tutorial/modules.html#intra-package-references

relative import를 absolute import로 수정했다. main이기 때문에 absolute import를 해줘야하기 때문이다.

6. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.

add_and_multiply.py는 패키지 내부 파일로 relative import 쓸수 있다.

main.py는 실제로 패키지와 모듈을 가져와 함수를 쓰는 파일이다.
그로 인해 단독 실행 가능 여부에 있어서도 차이를 보인다.

7. init.py 파일의 역할

init.py가 존재하는 디렉토리는 package 초기 설정을 할 수 있는 역할을 한다.

--init--.py 파일이 존재하지 않는다면
패키지의 일부인지 인식을 하지 못하기 때문에
속성을 가지고 있지 않는다는 에러가 발생하게 된다.
현재는 --init--.py파일은 빈 파일이지만
package 실행 시,
--init--.py의 초기 설정이 있다면
작성 한 코드의 내용대로 자동으로 실행된다.

파이썬은 왜 프로그램의 시작점이 정해져 있지 않나요?

파이썬이 처음에 개발 될 당시에는 리눅스/유닉스에서 사용하는 스크립트 언어 기반이었기 때문에 프로그램의 시작점이 따로 정해져 있지 않았습니다. 보통 리눅스/유닉스의 스크립트 파일은 파일 한 개로 이루어진 경우가 많은데, 이 스크립트 파일 자체가 하나의 프로그램이다 보니 시작점이 따로 필요하지 않습니다. 하지만 C 언어나 자바같은 언어는 처음 만들어질 때부터 소스 파일을 여러 개 사용했기 때문에 여러 소스 파일의 함수들 중에서도 시작 함수(main)를 따로 정해 놓았습니다.

profile
🇰🇷🇺🇸 #Back-End Engineer

0개의 댓글