파이썬 강좌(초급)/10.모듈과 패키지

10.모듈과 패키지 - 3) __all__ 변수

파기차차 2024. 4. 14. 11:47
728x90
반응형
SMALL

 

 

1)__all__변수가 뭐에요?

__init__.py 파일 내 __all__변수에 지정하는 것으로 모듈에서 다른 모듈이나 패키지로 공개할 이름들을 지정하는 변수입니다. 이 변수를 사용하여 해당 모듈이나 패키지를 import할 때 어떤 이름들이 직접적으로 import될지를 명시할 수 있습니다.

일반적으로 "import *" 이와같이 모든 자원을 임포트 하는 경우 __all__변수를 사용하여 사용할 모듈을 지정해 주어야 합니다.

 

 

아래와 같이 __init__.py 파일에 __all__ 변수를 사용하여 다른 모듈에서 사용할 수 있도록 모듈을 지정할 수 있습니다. 아래 예의 경우 thailand 모듈을 다른 모듈에서 사용할 수 있도록 설정하고 있습니다.(아래 디렉토리 구조 참조)

__init__.py

__all__ = ["thailand"]
 

 

 

[디렉토리 구조]

 

 

 

 

main.py 에서 travel패키지의 모든 자원을 사용하려면 아래와 같이 코딩합니다.

 

main.py

from travel import *
trip_to = thailand.ThailandPackage()
trip_to.detail()
 

 

 

만일 __init__.py 파일의 __all__변수에 thailand만 지정되어 있는데, 아래와 같이 코딩한 경우 에러가 발생하는데, 이는

__all__변수에 vietnam이 지정되어 있지 않기 때문입니다.

 

__init__.py

__all__ = ["thailand"]

 

main.py

from travel import *
trip_to = vietnam.VietnamPackage() # 에러 발생, __init__의 __all__변수 지정해줘야
trip_to.detail()
 

NameError: name 'vietnam' is not defined

 

 

아래와 같이 __all__변수에 vietnam 추가로 지정하면 main.py파일 실행시 에러가 발생하지 않습니다.

__init__.py

__all__ = [ "thailand" , "vietnam"]
 

 

 

main.py

from travel import *
trip_to = vietnam.VietnamPackage() # 권한 등의 문제로 사용하지 못함, __init__에서 지정해줘야
trip_to.detail()
 

베트남 패키지 입니다. <-- 에러 발생하지 않음

 

 

 

마찬가지로 __init__.py 파일의 __all__변수에 vietnam만 지정되어 있는데 아래와 같이 타일랜드 모듈에 접근하려고 하면 에러가 발생합니다.

trip_to = thailand.ThailandPackage()

 

__init__.py

__all__ = ["vietnam"]
 

 

from travel import *
trip_to = thailand.ThailandPackage()
trip_to.detail()
 

NameError: name 'thailand' is not defined

 

 

따라서 아래와 같이 __init__.py 파일의 __all__변수에 vietnam와 thailand를 함께 지정해 주어야 합니다.

__init__.py

__all__ = ["vietnam", "thailand"]
 

 

from travel import *
# trip_to = vietnam.VietnamPackage() # 권한 등의 문제로 사용하지 못함, __init__에서 지정해줘야
trip_to = thailand.ThailandPackage()
trip_to.detail()
 

태국 패키지 입니다. <-- 에러 발생하지 않음

 

 

 

 

728x90
반응형
LIST