sys.modules는 dictionary형태이고 sys.path는 List형태이다.
sys.modules는 파이썬이 가장 먼저 경로를 찾는 곳이고, sys.path는 가장 나중에 보는 곳이다.
sys.modules->built-in modules-> sys.path순서대로 보면서 찾아간다.
Absolute path는 최상위 디겍트리부터 시작해 경로가 길어질 수 있지만 relative path는 import하는 위치를 기준으로 시작하기 때문에 경로의 길이를 줄여준다.
앞으로 개발하면서 많은 패키지를 사용할 것이고 만들어야 하는 경우도 있을 수 있기 때문에 이번과제는 직접 패키지를 만들어 보는 과제 입니다.
로컬 환경에서 파이썬을 설치하고 진행해 주세요.
디렉토리 구조는 다음과 같고 각 파일의 코드내용은 다음과 같습니다.
__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
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
multiplication.py
def multiply(a,b):
return(a*b)
이렇게 만들었다.
다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.
https://docs.python.org/3/tutorial/modules.html#intra-package-references
위에 나와있는대로 만들고 main.py를 실행하니 다음과 같은 오류가 뜬다.
이 오류는 main.py 파일이 최상위 파일이라는 것을 알려준다.
상대경로를 주석처리하고 절대경로로 import하면 다음과 같이 결과가 잘 출력된다.
상대경로로 import 했을때: 오류
절대경로로 import 했을때: 실행됨.
add_and_multiply.py는 calculator 패키지 모듈이고 main.py는 add_and_multiply.py 모듈에 있는 함수를 받아 실행하는 모듈이다.
__init__
메소드는 class가 실체화 될때 사용되는 함수이다.
__init__
메소드를 부르지않았지만 클래스가 실체화될때 자동으로 __init__
메소드가 호출된다.
__init__.py
파일에는 아무 코드도 적혀있지 않지만 해당 디렉토리가 패키지임을 알려주는 역할을 한다.내부적으로만 사용되어야 하는 함수가 package 외부에서 import되어 사용되는 것을 막기 위해서는
__all__
변수를 지정해 줄 수 있다.
package를 통해 import 될 수 있는 요소들은 모두__all__
변수를 통해 정의 된다.
__all__
변수의 default 값은 모든 함수/변수/클래스 이다.
__all__
변수를 따로 정의해줌으로 import 될 수 있는 요소들을 제한할 수 있다.
__all__
변수는 string 값의 요소를 가지고 있는 list 이다.
import 되기 원하는 요소들을 string으로 list에 선언한다.
__init__.py
from .mod1 import func2
from .mod2 import func3
__all__ = ['func2', 'func3']
main.py
from pkg import *
func2()
func3()
func4() ## <== Error. func4 함수는 `__all__` 에 정의되지 않았으므로 import 될 수 없음.