티스토리 뷰

책의 앞부분에서 우리는 random 모듈을 import 할 때 * 를 사용함으로써 random 모듈 내의 모든 것을 가져다 쓸 수 있다고 공부한 적이 있습니다.

from random import *

 

travel 패키지도 같은 방식으로 한 번 사용해볼까요?

from travel import * 을 함으로써 travel 패키지의 모든 것을 가져다 쓰겠다고 하고 나서 VietnamPackage 객체를 만들어보겠습니다.

from travel import *
trip_to = vietnam.VietnamPackage() # 베트남
trip_to.detail()

 

실행시켜보니 다음과 같이 vietnam 이 정의되지 않았다며 에러가 발생하네요.

NameError: name 'vietnam' is not defined

 

왜 그럴까요?

* 을 쓴다는 것의 의미는 travel 이라는 패키지에 있는 모든 것을 가져다 쓰겠다는 것인데, 실제로는 패키지를 만든 사람이 공개 범위를 설정해줄 수가 있답니다. 즉, 패키지에 포함된 모듈 중에서 import 되기를 원하는 것만 공개를 하고 나머지는 비공개로 둘 수가 있는 거예요.

 

travel 패키지를 만들 때 함께 생성했던 __init__.py 파일을 열어서 다음과 같이 내용을 작성하겠습니다. __all__ 이라는 변수에 리스트 형태로 공개하려는 모듈 이름을 추가하면 해당 모듈에 대해 공개 설정을 할 수 있게 됩니다. 이 때, __all__ 앞 뒤로 밑줄은 2번씩 적어주셔야 한다는 점 주의해주세요.

__all__ = ["vietnam"] # vietnam 모듈 공개

 

__init__.py 파일을 저장하고 나서 원래 파일로 돌아와서 다시 코드를 실행해보겠습니다.

[베트남 패키지 3박 5일] 다낭 효도 여행 60만원

그랬더니 이번에는 베트남 패키지 상품 정보가 잘 출력되는 것을 확인할 수 있습니다.

그런데 태국은 어떨까요?

VietnamPackage 부분은 주석 처리를 하고 다음 줄에 ThailandPackage 객체를 만들도록 해보겠습니다.

from travel import *
# trip_to = vietnam.VietnamPackage()
trip_to = thailand.ThailandPackage() # 태국
trip_to.detail()

 

실행시켜보니 앞에서 발생한 에러가 모듈 이름만 바껴서 똑같이 나타납니다.

NameError: name 'thailand' is not defined

 

이는 현재 travel 패키지의 __init__.py 파일 안에서 __all__ 에는 vietnam 만 포함되어 있기 때문에, 즉 vietnam 모듈만 공개되고 있기 때문에 thailand 모듈은 사용이 불가한 것입니다.

 

에러를 해결하기 위해 __init__.py 파일을 열어서 리스트에 thailand 모듈을 추가한 후 저장하겠습니다. 이제 vietnam 과 thailand 모듈 모두 공개 설정이 된 상태입니다.

__all__ = ["vietnam", "thailand"] # vietnam, thailand 모듈 공개

 

원래 파일로 돌아와서 다시 코드를 실행해보면 이번에는 thailand 모듈에도 이상 없이 접근하여 올바른 동작을 하는 것을 확인할 수 있습니다.

[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함