[TIL_Python]Modules & Packages_2

3685 단어 TILpythonTIL

1. sys.modules 와 sys.path의 차이점을 서술해 주세요.

sys.modules는 dictionary형태이고 sys.path는 List형태이다.
sys.modules는 파이썬이 가장 먼저 경로를 찾는 곳이고, sys.path는 가장 나중에 보는 곳이다.


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

sys.modules->built-in modules-> sys.path순서대로 보면서 찾아간다.


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

Absolute path는 최상위 디겍트리부터 시작해 경로가 길어질 수 있지만 relative path는 import하는 위치를 기준으로 시작하기 때문에 경로의 길이를 줄여준다.


4. calculator 패키지 만들기

앞으로 개발하면서 많은 패키지를 사용할 것이고 만들어야 하는 경우도 있을 수 있기 때문에 이번과제는 직접 패키지를 만들어 보는 과제 입니다.

로컬 환경에서 파이썬을 설치하고 진행해 주세요.

디렉토리 구조는 다음과 같고 각 파일의 코드내용은 다음과 같습니다.

__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)


이렇게 만들었다.


5. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고

다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.

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

위에 나와있는대로 만들고 main.py를 실행하니 다음과 같은 오류가 뜬다.

이 오류는 main.py 파일이 최상위 파일이라는 것을 알려준다.
상대경로를 주석처리하고 절대경로로 import하면 다음과 같이 결과가 잘 출력된다.


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

상대경로로 import 했을때: 오류

절대경로로 import 했을때: 실행됨.

add_and_multiply.py는 calculator 패키지 모듈이고 main.py는 add_and_multiply.py 모듈에 있는 함수를 받아 실행하는 모듈이다.


7. init.py 파일의 역할에 대해서도 정리해서 블로깅 해주세요.

__init__메소드는 class가 실체화 될때 사용되는 함수이다.
__init__메소드를 부르지않았지만 클래스가 실체화될때 자동으로 __init__메소드가 호출된다.

  • __init__.py파일에는 아무 코드도 적혀있지 않지만 해당 디렉토리가 패키지임을 알려주는 역할을 한다.
  • 경로를 줄여준다.매번 모든 경로를 입력해줘야하는데 init.py 파일에 경로를 import해주면 다른 파일에서는 짧게 출력할 수 있다.
  • import 할 수 있는 변수/함수/클래스를 제한할 수 있다.

    내부적으로만 사용되어야 하는 함수가 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 될 수 없음.

좋은 웹페이지 즐겨찾기