__init__.py 파일의 역할

Ju Seol·2021년 6월 9일
0

__init__.py 파일

__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다.
__init__.py 파일이 존재하지 않는다면 패키지의 일부인지 인식을 하지 못하기 때문에 속성을 가지고 있지 않는다는 에러가 발생하게 된다.
__init__.py 파일이 존재하지 않는다면 패키지의 일부인지 인식을 하지 못하기 때문에 속성을 가지고 있지 않는다는 에러가 발생하게 된다.

※ python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.

__init__.py 파일을 통해 하는일들
1. Import 할때 경로의 총 길이 줄여줌
2. Package에서 import 할 수 있는 변수/함수/클래스 제한
3. package가 import될때 꼭 먼저 실행되어야 하는 코드 삽입

main.py에서 상대경로로 add_and_multiply.py를 import할 수 없는 이유

main.py 를 실행하게 되면, 아래와 같은 오류가 발생하게 된다.

Traceback (most recent call last):
  File "/Users/ylee/PycharmProjects/replit calculator/main.py", line 6, in <module>
    from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package

relative path 말고 absolute path 로 바꾸면, 잘 작동한다.

if __name__ == "__main__" 의 의미를 먼저 살펴봐야겠다.

__name__ : module의 이름이 저장되는 변수. import로 모듈을 가져왔을 때 모듈의 이름이 들어간다.

하지만 파이썬 인터프리터로 스크립트 파일을 직접 실행했을 떄는 모듈의 이름이 아니라 __main__ 이 들어간다.

어떤 스크립트 파일이든 파이썬 인터프리터가 최초로 실행한 스크립트 파일의 __name__에는 __main__이 들어간다. 이는 프로그램 시작점(entry point)이라는 뜻.

if __name__ == '__main__':처럼 __name__ 변수의 값이 __main__인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다. 즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도이다.
(참고 자료 : https://pinocc.tistory.com/175 , https://dojang.io/mod/page/view.php?id=2448)

하지만 relative import는 현재의 모듈을 기반으로 이루어진다. 메인 모듈의 이름은 항상 __main__이고, 파이썬에서 메인 모듈은 항상 absolute import를 사용해야하기 때문에 relative path를 absolute path로 설정해주면 오류가 발생하지 않는다.
(참고: 파이썬 공식 문서 https://docs.python.org/3/tutorial/modules.html#intra-package-references )

add_and_multiply.py에서 multiply함수를 절대경로와 상대경로로 import하는 것과 main 모듈과의 차이점

add_and_multiply.py 의 절대경로와 상대경로 모두 정상적으로 출력된다.
add_and_multiply.py 는 패키지 안에 들어있는 모듈이기 때문에 절대경로와 상대경로 모두 실행되며, main.py는 패키지 안에 들어있지 않기 때문에 상대경로는 실행이 안되고 절대경로만 실행이 된다.

profile
Hello!

0개의 댓글