Python에서 __all__

Hiten Kanwar 2021년11월30일
Python에서 __all__

패키지와 모듈에 대해 더 깊이 들어가면 다른 _init_.py 파일에 설정된 __all__ 변수를 만날 수 있습니다.

__init__.py 파일은 파이썬이 디렉토리를 패키지를 포함하는 일부로 취급하게 하는 파일입니다. 이 파일은 문자열과 같은 유사한 이름을 가진 디렉토리가 나중에 모듈 검색 경로에서 발생할 수 있는 유효한 모듈을 숨기는 것을 방지합니다.

가장 간단한 경우 __init__.py는 빈 파일일 수 있지만 패키지의 초기화 코드를 실행하거나 __all__ 변수를 설정할 수도 있습니다.

따라서 __init__.py는 패키지에 대한 __all__ 변수를 선언할 수 있습니다.

해당 모듈의 공용 개체 목록은 __all__ 변수에 제공됩니다. import *로 해석됩니다. 이 변수는 지정된 네임스페이스에서 밑줄로 시작하는 모든 항목을 숨기는 기본값을 재정의합니다.

예를 들어,

__all__ = ["a", "b"]
c = 5
a = 10


def b():
    return "b"

이제 다음 코드에서 이것을 가져옵니다.

from sample import *

print(a)  # will work fine
print(b)  # will work fine
print(c)  # will generate an error

위의 예에서 sample.py 파일의 모든 공용 개체를 이 파일로 가져오기 위해 import *를 사용했습니다. 이는 이 파일이 sample.py 파일의 모든 공용 개체를 가져오고 지원함을 의미합니다.

ab 개체를 가져오고 새 코드는 이러한 개체가 사용되는 곳에서 완벽하게 작동합니다. 문제는 세 번째 객체 c를 사용할 때 발생합니다. 해당 개체는 __all__ 변수의 일부가 아니므로 공용 개체가 아니므로 새 파일로 가져오지 않습니다. 따라서 코드의 이 부분은 오류를 생성합니다.

이에 대한 대안이 있습니다. 기본적으로 Python은 밑줄 _로 시작하지 않는 모든 이름을 내보낼 책임이 있습니다. 그리고 확실히 이 메커니즘에 의존할 수 있습니다. Python 표준 라이브러리에서 일부 패키지는 이에 의존하지만 이를 위해 os_os로, sys_sys 등으로 별칭을 지정합니다.

_ 규칙을 사용하면 이름을 반복적으로 명명하는 중복성을 제거하므로 더 편리합니다. 그러나 가져오기에 대한 중복성이 추가되며(많은 경우) 이 작업을 일관되게 수행하는 것을 잊기가 더 쉽습니다.

표준 라이브러리의 많은 패키지가 __all__을 사용합니다. 아직 초기 개발 모드에 있고 사용자가 없고 지속적으로 API를 조정하는 경우 __all__ 대신 _ 접두사 규칙을 사용하는 것이 좋습니다. 일부 사용자가 있을 수 있지만 API를 다루는 단위 테스트가 있고 여전히 API를 적극적으로 업데이트 및 추가하고 개발 과정에서 조정하는 사용자가 있습니다.