모듈(module)에 대해서 알아보자.
모듈
모듈 불러오기 (import)
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()
같은 디렉토리 안에 있는 .py파일일 경우 또 다른 파일에서 import 로 불러올 수 있다.
__name__ 변수
lol.py가 실행될 때, game과 shop가 import되는 순간 해당 코드가 실행되어 버리는 문제가 있다.
이 때, 파이썬 인터프리터를 이용해 실행한 코드인지를 확인하여 단순히 import한 모듈의 경우 실행을 막는 방식을 사용할 수 있다.
각 모듈은 자신의 이름을 가지며, 모듈 이름은 모듈의 전역변수 __name__에서 확인 할 수 있다.
print(__name__)
파이썬 인터프리터가 실행한 모듈의 경우, __main__이라는 이름을 가진다. 따라서 python <파일명>으로 실행한 경우에만 동작할 부분은 if문으로 감싸준다.파일명>
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 리팩토링
import game
import shop
def turn_on():
print('= Turn on game =')
while True:
choice = input('What would you like to do?\n 1: Go to Shop, 2: Play Game, 0: Exit\n Input : ')
if choice == '0':
break
elif choice == '1':
shop.buy_item()
elif choice == '2':
game.play_game()
else:
print('Choice not exist')
print('-----------------------')
print('= Turn off game =')
if __name__ == '__main__':
turn_on()
모듈명을 안쓰고 함수를 호출하는 방법
from 모듈명 import 모듈의 함수명
from game import play_game
from shop import buy_item
from 모듈명 import *
해당 모듈의 모든 함수를 모듈명을 안쓰고 호출 할 수 있다.
from game import *
from shop import *
네임스페이스(Namespace)
각 모듈은 독립된 네임스페이스(이름공간)를 가진다. 메인으로 사용되고 있는 모듈이 아닌 import된 모듈의 경우, 해당 모듈의 네임스페이스를 사용해 모듈 내부의 데이터에 접근한다.
같은 함수명을 가진 모듈을 2개 만들고, 한 쪽에서 다른 한 쪽의 모듈을 import 한 뒤 각각의 모듈의 함수를 실행시켜보면 더 나중에 import한 모듈의 함수가 실행된다.
as로 별칭 할당
from 모듈명 import 또는 import 모듈명에서, 같은 모듈명이 존재하거나 혼동 될 수 있을 경우, 뒤에 as를 붙여 사용할 모듈명을 변경할 수 있다.
커맨드라인에서 인자 전달
프로그램 실행 시 인자를 전달 할 수 있다. 파이썬의 내장sys모듈의 argv리스트에서 확인 할 수 있다.
리스트의 첫 번째 항목은 모듈명이 전달되므로, 2번째 항목부터 전달 된 값을 확인 할 수 있다.
패키지(package)
패키지는 모듈들을 모아 둔 특별한 폴더를 뜻한다. (일반적인 폴더와는 다르다)
폴더를 패키지로 만들면 계층 구조를 가질 수 있으며, 모듈들을 해당 패키지에 모을 수 있는 역할을 한다.
패키지를 만들 때는 패키지로 사용할 폴더에 __init__.py파일을 넣어주면, 해당 폴더는 패키지로 취급된다. (비어있어도 무관하다)
shop.py와 game.py를 func패키지에 넣어본다.
├── func
│ ├── __init__.py
│ ├── game.py
│ └── shop.py
└── lol.py
패키지는 모듈과 동일하게 import할 수 있으며, 위와 같이 func패키지에 모듈들을 넣은 경우에는
from func import game, shop으로 기존 코드의 변경 없이 패키지에서 모듈을 가져오는 방식을 사용할 수 있다.
또는 단순히 import func후 func.game, func.shop을 사용하는 방식도 가능하다.
패키지에 포함된 하위 패키지 및 모듈을 불러올 때, * 을 사용하면 해당 모듈의 모든 식별자들을 불러온다.