import 정책에 관한 정리

백승진·2020년 10월 23일
0

1. sys.modules 와 sys.path의 차이점.

sys.path 는 파이썬이 모듈 또는 패키지를 찾을 때 sys.modules, sys.built-in 에서 찾지 못했을 경우 마지막으로 탐색하는 대상이다. import 해야 하는 모듈 또는 패키지의 절대 부모경로들을 관리하는 list로 여기서 관리되는 경로 밑의 모듈 및 패키지는 상세경로 지정없이 쉽게 호출할 수 있다. 경로는 sys.path를 통해 파이썬이 찾는다.
sys.modules는 파이썬이 모듈 또는 패키지를 찾을 때 가장 먼저 검색하는 곳이다. import 가 수행된 대상 모듈 또는 패키지의 정보를 Dictionary로 관리하며 여러곳에서 import 시도시 다시 찾는 수고를 겪지 않게 끔 지원한다.

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

위처럼 sys.modules를 출력해보면 맨 처음에 sys가 등장하며 value 값으로 built-in이 표시된다. 파이썬에 내장된 built-in 모듈이므로 어디서든 import 할 수 있다.

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

Absolute path는 import 하고자 하는 모듈 또는 패키지를 프로젝트 최상위 경로 기준으로 절대 경로를 의미함. 예를 들어보면...
"import package1.subpackage2.subofsubpackage1.util"
위 내용은 project 최상위 경로에 있는 package1에 대해 "package1/subpackage2/subofsubpackage1/util.py" 를 import 한다는 의미이다.
폴더의 트리구조가 깊어질수록 경로명도 길어진다는 단점이 있다.

relative path는 import를 시도하는 모듈의 "경로"를 기준으로 대상의 상대경로를 의미함. 위에서 언급한 경로를 기준으로 예를 들어보자.
subpackage2에 "main.py"가 있고 main.py가 util.py를 import 하고 싶다면...
"import ..subpackage2.subofsubpackage1.util"
위 내용에서 '.'는 import를 호출하는 파일의 경로를 기준으로 동일 경로 혹은 상위 경로를 표현할때 사용한다. '.'같은 경로, '..'는 상위 경로를 의미.

그래서 차이점은?
Absolute는 전체 경로를 써야하는 불편함이 있지만 절대 경로이기에 바로 경로를 이해할 수 있고 relative는 상대적으로 경로를 함축할 수 있으나 직관적이지 않다는 문제가 있다. 가급적이면 Absolute 방식을 사용하는 것을 권유한다.

4. Relative path 시 감안해야 하는 문제 (__main__ 모듈)

위는 calculator라는 package를 구성하고 main.py 에서 add_and_mutiply.py 모듈을 import 시도하다 Error가 발생한 화면이다. relative path 방식으로 import를 시도하고 있는데 "__name__"이 "__main__" 인 모듈은 오직 Absolute path만 사용해야 한다는 규약이 있어 Error가 발생한 것으로 Absolute path 방식으로 사용해야 함.

5. "__main__" 이 아닌 모듈에서의 Absolute path, relative path 방식 확인

__main__ 이 아닌 모듈에서 relative path, Absolute path import의 실행 결과 에러없이 동일한 결과를 보여준다.

6. __init__.py 파일의 역할

Package가 깊은레벨의 Tree 구조일 때 Absolute path 방식으로 import시 길어지는 경로
를 간소화하도록 import 코드 정의할 수 있다.
pack/util.py 가 있고 이 안에 함수 test()가 정의되어 있다 가정시 pack과
동일 경로에 있는 main.py에서 test()를 사용하기 위해선 다음과 같이 import 할 것이다.
from pack.util import test
만약 util이 subpack이 아니라 더 하위 package에 있다면 위 import 길이는 더 길어질 것이다. pack의 __init.py__ 을 아래와 같이 작성해보자.
from .util import test
이러면 main.py 입장에선 아래와 같이 간소화된 import 사용이 가능해진다.
from package import test

Package가 import 될 때 실행되야 하는 코드들 정의 할 수 있다.
위에서 설명한 경로 간편화 작업이 이에 해당한다.

import 할 변수/함수/클래스 제한 기능을 지원한다.
__init.py__ 내에서 __all__ 이라는 list를 관리하는 방법으로 __all__에 import를 허용할 변수/함수/클래스 이름을 등록하면 된다. 기본적으로 모든 변수/함수/클래스를 허용하게 되어있으며 __all__을 지정하는 순간부터 등록된 변수/함수/클래스만 import 허용으로 제한하게 된다.

profile
12년 .NET 개발 경력을 가진 웹 초짜 개발자입니다 :)

0개의 댓글