본문 바로가기
학부생나부랭이/_with_Python

Replacing the main language with Python (1)

by 호상 🐧 2022. 10. 5.

모듈 객체(module object)

나는 디렉토리 자체가 객체가 될 수 있다곤 생각을 안해 봤는데, 모듈 객체라는 것이 있는것을 확인하였다.  이번에도 역시 예시는 mmediting 이다. 연구실 과제를 진행하며 코드를 열심히 뜯어보고 씹어보고 있는데 이상한 코드를 발견 하였다. 

일단 해석해보자면, ' mmcv 위치에 있는 cnn 에서 MODELS 를 import 해서 MMCV_MODELS 라고 부르겠다' 라는 것인데, 지난번 포스팅에서 from (pakage) 라고 했으니 일단 넘어가고 import 할때 MODELS 라고 명시되어 있는데 암만 봐도 MODELS 라는 파일은 존재 하지 않았다. 그래서 평소에 그냥 넘어갔던 __init__.py 를 살펴봤다. 

여기서 MODELS 가 있는것을 발견 했다. 그래서 '이 MODELS 를 가져오겠네?' 라는 컴공 3년 짬으로 찍어 맞춰보았다. (누가봐도 저거겠지 임마 ) 아무튼 여기서 궁금한 점은 __init__ 과 __all__ 이 무엇이냐는 것이다. 

 

그래서 찾아본 __init__ 과 __all__

역시 컴공생의 아버지이자 어머니이신 구글이 친절히 잘 알려준다.

 

__init__.py >>

해당 파일은 본 디렉토리가 패키지의 일부임을 알려주는 역할을 한다. 디렉토리(폴더) 에 본 파일이 없다면 패키지로 인식되지 않을 수 있다는 점을 가지고 있다. 즉 디렉토리를 모듈로 만들어주는 역할을 하는것인가? 하는 생각이 든다. 그런데 python 3.3. 이상 버전에서는 __init__.py 가 없어도 패키지의 일부로 인식한다고 한다. 그럼에도 있는 이유는.....대규모 software 라서...? 가시성을 위해서...? 코드의 간편화를 위해서...? 이지 않을까 라는 생각을 한다.

 

아무튼 해당 디렉토리를 모듈로 만들어 주고, init 파일을 통해 패키지와 함께 import 하고 싶은 것들을 작성해 주면 간단한 코드가 완성된다. 

 

예를 들어 보겠다.

 

해당 파일은 위에서 예시를 든 mmcv.cnn 디렉토리의 init 파일이다. 본 파일은 위와 같이 같은 디렉토리에 있는 파일들을 from 을 통해 import 를 명시 하였다. 

 

따라서 다시 코드를 보자면 mmcv.cnn 은 모듈이자 디렉토리가 되었고, 직접 파일에 접근하지 않고 import MODELS 를 해줄 수 있는것이다. init 파일 코드에서 from .builder import MODELS, build_model_from_cfg 를 통해서 말이다.

 

첫번째 궁금증은 해결이 되었다. 다음으론 __all__ 이다.

 

__all__ 은 import * 을 했을 때, 어떤 것들을 가져와야 하는지 정해주는 것이다. import 대상 중 내용 전체를 가져오라고 했을 때, __all__ 에서 정의된 모든것을 가져오게 된다.

 

간단히 예시를 들자면, (코드가 맞는진 모르겠지만......?)

 

위와 같이 코드를 명시 했을때, ( * ) 부분 은 아래와 같은 것들을 모두 불러오게 되는것이다. 

 

 

__all__ 을 사용하는 이유는 패키지난 모듈을 통해 import * 을 한다면 어떤 것들이 import 되는지 알 수 없기 때문에 사용하게 된다. 이를 사용하면 import 되는 것을 제어 할 수 있다. 하지만.....이를 꼭 써야하나...? 라는 의문이 든다. 나중에 대규모 software 를 내가 개발하게 된다면 사용의 필요성을 느끼게 될까? 아무튼 여기까지.

댓글