Python 모듈과 패키지

모듈과 패키지

module

python file은 각각 하나의 모듈로 취급된다.

import module

기본 게임 모듈에서 부가적인 기능을 불러와서 사용하는 형태

module/shop.py

def buy_item():
    print('Buy item!')

buy_item()

module/game.py

def play_game():
    print('Play game!')

play_game()

module/lol.py

import game
import shop

print('= Turn on game =')
game.play_game()
shop.buy_item()

__name__변수

module/lol.py가 실행될 때, game과 shop module이 import되는 순간 실행되는 것을 막기 위해 각 모듈 이름을 확인할 수 있는 전역변수 __name__을 이용한다.

module/shop.py

def buy_item():
    print('Buy item!')

if __name__ == '__main__':
    buy_item()

module/game.py

def play_game():
    print('Play game!')

if __name__ == '__main__':
    play_game()

그리고 lol.py를 실행해본다.

package

패키지란 모듈들을 모아두는 폴더
패키지로 사용할 폴더에 __init__.py파일을 넣어주면 패키지로 취급된다.
shop.pygame.pyfunctions 패키지에 넣을 경우

├── functions
│   ├── __init__.py
│   ├── game.py
│   └── shop.py
└── lol.py

패키지 import :

  1. from functions import game, shop
  2. import functions -> 사용시 functions.game, functions.shop

*, all

  1. *: 해당 모듈의 모든 식별자들을 불러온다.
  2. all : 각 모듈에서 자신이 import될 때 불러올 목록을 지정하고자 할 때

example

>>> from game.sound import *
>>> echo.echo_test()
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
NameError: name 'echo' is not defined

__all__의 용도

# C:/doit/game/sound/__init__.py
__all__ = ['echo']

특정 디렉터리의 모듈을 * 을 이용하여 import할 때에는 위와 같이 해당 디렉터리의 __init__.py 파일에 __all__이라는 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.

위와 같이 __init__.py를 변경한 후 위 예제를 수행하면 원하던 결과가 출력이 된다.

>>> from game.sound import *
>>> echo.echo_test()
echo