<체크포인트4 : 파이썬이 모듈과 패키지를 검색하는 과정 및 방법>
import abc
import 했다 -> 어디 있지?(sys.modules > built-in > sys.path 경로 추적)
sys.modules : 가장 먼저 확인. 딕셔너리 형태로 이미 import 된 것들 찾아줌.
built-in modules : 공식 라이브러리
sys.path : 리스트 형태.
만일 다 못 찾으면? : 에러
R : 프로젝트의 최상단 디렉토리를 기준(최고 높이 폴더)이 아니라 import하는 기준에서 경로를 정의. 일반적으로 이미 들어와있는 로컬에서 다른 로컬을 부를 때 많이 사용한다.
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
경로를 줄여준다는 장점은 있지만 헷갈림. 파일 위치가 변경되면 경로 위치도 다시 다 조정해줘야 함.(권장하지 않는 방식)
과제 1 : sys.module vs sys.path
가장 큰 차이점 : sys.module은 딕셔너리({모듈이름} : {모듈경로}) 형태지만 sys.path는 리스트 형태를 지니고 있다.
과제 2 : sys도 import해야 함. sys는 그럼 어떻게 찾을까? : sys는 built-in mudules이므로 따로 import시 어디서 찾을 필요가 없다.(내장형이기 때문에!)
과제 3 : A vs R 차이점
절대 경로는 최상위 디렉토리부터 내려와서 모듈들의 경로가 결정되지만
상대 경로는 현재 Import하는 기준에서 경로를 정의하기 때문에 자칫 경로가 복잡해질 때 단점이 될 수 있다.
(연동 된 것들)
과제 4 : Calculator 패키지 만들기 : VSC로 구현
과제 5 : main.py error 확인하고 공식문서 참고 후 main module에서 패키지의 모듈 어떻게 임포트 해야 하는지?
시도 했을 때 나오는 에러 :
ValueError: Attempted relative import in non-package
직역하면 값 에러로 시도된 상대적인 import가 없는 패키지에 있다는 것 같다.
시도 해본 것 : from .. ~ import
; 같은 에러 남
그래서 .을 아예 지워보기로 함 ; 성공
왜 성공했을까? : 알고 보니 절대 경로로 바꾼 사례여서 성공한 것임. 근데 문제가 상대경로이므로 다른 경우의 수 찾아보자.
먼저 relativ path를 언제 썼더라? :
일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용
하지만 공식문서에서 나온 것을 보면?
상대 임포트가 현재 모듈의 이름에 기반을 둔다는 것에 주의하세요. 메인 모듈의 이름은 항상 "main" 이기 때문에, 파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대 임포트를 사용해야 합니다.
내가 풀어야 하는 문제는 현재 서브 패키지로 구조화된 패키지 하나와 메인 py가 있는 구조다. 그런데 공식문서 상 메인의 경우는 절대 임포트를 사용해야 하므로 . 을 없애고 절대 임포트를 하는 것이 옳다.
과제 6 : add~.py 에서 A, R 각각 임포트 해보고 main 모듈과 차이점 생각, 결과도 출력해보기
main모듈과의 차이점 : 메인은 절대 임포트를 사용해야 하는 상황이었음.
from multiplication import multiply
에러가 계속 나는 이유에 대한 생각 :
__main__
이라는 요소로 인해 모듈들을 불러와 결과를 냈지만 위 파일들은 그렇지 못한 상황이라고 판단. 그래서 절대경로로는 이상없이 되지만 상대 경로로는 이와 같은 속성이 없기 때문에 불가능하지 않을까?ImportError: attempted relative import with no known parent package
이유는 python 자체에서 패키지와 모듈을 가져와 함수를 쓰는 곳에서는 상대경로로 접근자체가 불가능하게 막아놓았다.
과제 7 : __init__.py
파일의 역할은? : 이 파일은 해당 디렉토리가 패지키의 일부임을 알려주는 역할을 한다. ; 일종의 패키지다! 라고 선언해주는 표시 같은 역할. 이 외에도 패키지를 초기화 하는 역할을 한다.(장고에서 많이 본 것 같다.)