Module
은 변수나 함수 그리고 클래스 등을 모아놓은 파일입니다. Module
로 모아놓으면 다른 파일에서 재사용이 가능하고, 전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리할 수 있습니다.
import 방법
import <module name>
or
from <module name> import <함수/변수/클래스>, ...
or
from <module name> import *
Module
을 한번에 불러올 수 있고, Module
내의 필요한 함수나 변수 또는 클래스만 불러올 수 있습니다. import *
을 사용하게 되면 Module
내의 모든 함수,변수,클래스를 불러옵니다. 하지만 이 방법을 추천하지 않습니다. 만일 local scope
을 가지고 있는 다른 함수/변수/클래스와 이름 충돌이 났을 경우 이유를 찾기 힘들 수 있습니다.
Package
는 Module
과 마찬가지로 다른 파일에서 불러와서 사용하는 개념입니다. 차이점은 모듈보다 더 크고 복잡한 코드입니다.
Package
는 파이썬 파일로 이루어져 있는 디렉토리가 하나의 package
가 됩니다.
import 방법
import pkg.mod1
from pkg.mod2 import func2
pkg.mod1.func2()
func2()
Q. sys.modules 와 sys.path의 차이점을 서술해 주세요.
sys.modules
는 package
나 module
을 찾기 위해 가장 먼서 살펴보는 곳으로 이미 import
되어있는 package
나 module
이 dictionary
형태로 저장되어있습니다.
sys.path
는 여러 가지 경로가 저장되어있는 list
로 package
를 찾을 때 가장 나중에 서칭하는 곳입니다.
Q. sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?
sys
를 먼저 sys.modules
에서 이미 import
되어있는지 확인하고, 없다면 built-in
모듈을 확인할 것입니다. sys
는 Python
에서 지원해주는 모듈이기 때문에 이곳에서 찾을 것입니다.
Q. Absolute path와 relative path의 차이점을 서술해 주세요.
Absolute path
는 절대 경로로 최상위 폴더부터 목표 디렉토리까지의 순차적인 경로를 표현합니다. Absolute path
를 사용하면 명확하게 위치를 알수 있지만, 코드의 길이가 너무 길어지는 단점이있습니다.
g
relative path
는 상대 경로로 현재 위치에서부터 목표 데렉토리까지의 경로를 표현합니다. relative path
는 .
은 현재 디렉토리 ..
은 상위 디렉토리로 훨씬 짧아진 코드를 볼수 있지만 명확하지않아 헷갈리는 경우가 많습니다.
Q. ImportError: attempted relative import with no known parent package이 발생한 이유와
import
방법에 대하여 설명하시오.
Package
를 임포트해 relative path
로 모듈의 위치를 찾을때 __name__
에 의해 결정되는데, Python
을 실행했을 때 __name__
이 __main__
이 됩니다. 따라서 Python
에서는 __main__
의 위치를 찾을 수 없기 때문에 absolute path
를 사용해야 합니다.
Q.
__init__.py
파일의 역할에 대해서도 정리해서 블로깅 해주세요.
__init__.py
파일은 현재 디렉토리가 Package
라는 것을 인식시켜주는 파일입니다.
__init__
파일 안에 __all__
이라는 List
가 있고 그 안에 이름들이 들어있는 경우가 있습니다. *
로 모듈들을 불러올때는 __all__
에 정의되어있는 모듈들만 가져옵니다. __all__
이 정의되어있지 않으면 인식되지 않습니다.