본문 바로가기
파이썬(Python)/파이썬 지식

파이썬의 모듈에 대한 모든 것 feat. __name__?, __init__?

by 기계공학 주인장 2023. 11. 2.
반응형

저는 다른 프로그래밍 언어를 공부했기 때문에 기본적인 문법은 금방 익힐 수 있지만

 

파이썬의 모듈에 대한 내용이 조금 생소했습니다.

 

파이썬의 모듈, 패키지를 다루다보면 반드시 마주치는 것들인

 

__init__, __name__, __all__ 등에 대해 알아보겠습니다.

 


파이썬에서 모듈이란?

파이썬을 사용하면 모듈이라는 말이 자주 등장합니다.

 

파이썬에서 모듈이란

 

 

변수, 함수, 클래스 등을 포함하는 파일

 

즉, '.py' 확장자를 가진 파이썬 스크립트 단위를 모듈이라고 부릅니다.

 

참고로 파이썬에서 모듈은 import를 사용해서 다른 모듈에 정의한 함수, 클래스, 변수 등을 가져와서 사용할 수 있습니다.

 


파이썬의 __name__

__name__은 파이썬에 내장된 특별 변수입니다.

 

주로 해당 모듈이 직접 실행되었는지 아니면 다른 모듈에 import 되었는지 확인하기 위해 사용됩니다.

 

그렇기 때문에 모듈 내에서 테스트 코드와 실제 사용되는 코드를 구분하여 실행할 때 주로 사용됩니다.

 

def some_function():
    print("This is a function in the module")

# "__main__"과 일치하면 해당 모듈 내에서 실행된 것임을 의미
if __name__ == "__main__":
    # 모듈이 직접 실행될 때만 실행되는 코드
    print("This code runs when the module is executed directly")
    some_function()
else:
	# 다른 모듈에 import 되었을 때 호출되는 영역
    print("other module")

 

중요한 것은 else: 부분은 다른 모듈에 import 되었을 때 호출된다는 것입니다.

 

실행 결과는 다음과 같습니다.

 

<본인 파일에서 some_function()을 호출했을 때>

 

<다른 파이썬 파일에서 some_function()를 호출했을 때>


파이썬의 __all__

해당 패키지 내의 모듈을 어느정도 공개할 것인지 알려주는 역할을 합니다.

 

여기서 모듈은 파일 이름뿐 아니라 변수, 함수, 클래스명도 포함됩니다.

 

예를 들어 다음과 같은 패키지와 모듈이 있다고 가정하겠습니다.

 

test_package/test.py

 

def public_function():
    pass

def _private_function():
    pass

class PublicClass:
    pass

class _PrivateClass:
    pass

public_val = 0
_private_val = 1

 

이제 해당 모듈의  __all__에 다음과 같이 정의하면

 

def public_function():
    pass

def _private_function():
    pass

class PublicClass:
    pass

class _PrivateClass:
    pass

public_val = 0
_private_val = 1

__all__ = ['public_function', 'PublicClass', 'public_val']

 

즉, __all__을 보면 아래의 세 모듈을 공개한다는 것을 명시한다는 의미입니다.

 

'public_function', 'PublicClass', 'public_val'

 

그럼 _private가 붙은 애들은 다른 모듈에서 호출할 수 없나?

 

그건 또 아닙니다.

 

예를들어 다른 모듈에서 다음과 같이 호출하면 _PrivateClass()를 호출할 수 있습니다.

 

from test_package.travel import PublicClass, _PrivateClass

travel_package = PublicClass()
private_travel_package = _PrivateClass()

 

하지만 다음과 같이 경고가 뜨게됩니다.

 

 

__all__은 모듈에서 공개할 식별자를 명시적으로 정의함으로써 모듈 사용자에게 모듈 내에서 어떤 것이 중요하고 공개되어야 하는지 알려줄 수 있습니다

 

 

그럼 __all__을 정의하지 않거나 빈칸으로 두면 어떻게 될까?

__all__을 그대로 두면 모든 항목에 대해 다른 모듈에서 사용할 수 있다는 것을 의미합니다.


파이썬의 __init__

__init__.py은 패키지 디렉토리(=해당 패키지의 최상단)에 위치하는 특별한 파일입니다.

 

__init__.py는 다음과 같은 역할을 가집니다.

 

  1. __init__.py 파일이 존재함으로써 파이썬이 해당 폴더를 패키지로 인식하게 한다.
  2. __init__.py 파일 내에 정의한 변수, 함수는 해당 패키지 내의 모든 모듈에서 공용으로 사용할 수 있다.(단, import는 필요함)
  3. 해당 패키지가 import될 때 실행되기 때문에 패키지 단위의 초기화 코드를 실행할 수 있습니다.

 

반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


댓글