파이썬에서 __all__은 모듈이 from module import * 구문을 사용할 때, 외부에 공개할 객체의 리스트를 정의하는 특별한 변수이다. 이를 통해 모듈이 외부에 노출하는 인터페이스를 명확히 할 수 있다. __all__에 정의되지 않은 객체는 from module import * 구문으로 임포트되지 않는다.
기본 개념
__all__ 변수는 모듈의 네임스페이스에 정의된 공개 객체의 이름을 문자열로 포함하는 리스트이다. 이를 통해 모듈이 공개할 객체를 명시적으로 정의할 수 있다.
다음은 __all__의 기본 사용 예제이다.
mymodule.py
__all__ = ['public_function']
def public_function():
print("This is a public function.")
def _private_function():
print("This is a private function.")
main.py
from mymodule import *
public_function() # This is a public function.
# _private_function() # NameError: name '_private_function' is not defined
__all__ 리스트에 public_function만 포함되어 있기 때문에, from mymodule import * 구문은 하나의 객체만 임포트한다.
_private_function는 __all__ 리스트에 포함되지 않았기 때문에 임포트되지 않으며, main.py에서 접근할 수 없다.
__all__의 장점
명확한 인터페이스 정의: __all__을 사용하면 모듈이 외부에 공개할 객체를 명확히 정의할 수 있어, 모듈의 공용 인터페이스를 쉽게 파악할 수 있다.
캡슐화 강화: 중요한 내부 구현 세부 사항을 숨길 수 있어, 모듈의 사용자가 의도하지 않은 내부 객체에 접근하지 않도록 할 수 있다.
코드 유지보수성 향상: 모듈의 외부 인터페이스를 명확히 정의함으로써, 모듈을 수정할 때 의도하지 않은 외부 영향(다른 모듈이나 코드에 미치는 영향)을 줄일 수 있다.
주의사항
__all__은 from module import * 구문에만 영향을 미친다. import module이나 from module import specific_name 구문에는 영향을 미치지 않는다.
__all__에 정의되지 않은 객체도 여전히 직접 임포트할 수 있다. 예를 들어, from mymodule import _private_function은 여전히 유효하다.
모듈 내에서 밑줄(_)로 시작하는 이름은 관례적으로 프라이빗(내부용)으로 간주되지만, 이는 강제되지 않으며 __all__에 포함할 수도 있다.
main.py
from mymodule import _private_function
_private_function() # This is a private function.
이 예제에서 _private_function은 __all__에 포함되지 않았지만, 직접 임포트하여 사용할 수 있다.