ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 12. 파이썬 패키지와 모듈
    파이썬(Python) 강의 2019. 2. 19. 16:53

     인간은 한 번에 정보를 인지하고 처리할 수 있는 양에 한계가 있다고 한다. 그래서 큰 일이 주어졌을 때, 자연스럽게 그 일을 쪼개서 해결하려고 한다. 코드도 마찬가지이다. 코드의 양이 너무 커지면 디버깅하기도, 수정하기도 힘들다. 그래서 우리는 특정 일을 하는 부분을 함수로 만들어 코드를 더 간결하게 또 일을 기능 별로 나누었다. 모듈과 패키지는 그 개념의 확장이다. 한 파일에 함수가 너무 많아지면 파일이 길어지고 읽기가 힘들어진다. 따라서 우리는 비슷한 또는 하나의 목적을 이루기 위해 작성된 함수들을 모아 모듈(Module)을 만든다. 만약 모듈의 길이가 너무 길어지면 우리는 모듈을 여러개로 분리 한 후 그 모듈들을 묶어 패키지(Package)로 만든다. 이 포스트를 통해 파이썬에서 어떻게 모듈을 만들고, 모듈을 불러오고, 패키지를 만들고, 패키지의 모듈을 불러오는지 알아보도록 한다. 파이썬에서의 모듈은 여러가지가 있지만 이 포스트에서는 파이썬으로 작성 할 수 있는 모듈만 다루도록 한다.

    들어가기전에

    이 포스트는 여러분이 파이썬을 설치했고 각자 원하는 IDE를 이용해 파이썬을 개발한다고 가정한다. 혹시 파이썬을 설치하지 않았다면  1.파이썬 설치 및 개발환경 설정 이 포스트에서 파이썬과 파이썬 개발환경을 먼저 셋업하길 바란다. 앞서 말했듯이 반드시 실습 해 보길 바란다. 이 포스트는 여러분이 파이썬의 주요 자료형과 함수를 알고있고 사용 할 수 있다고 가정한다.

    목표

    • 모듈(Module)과 패키지(Package)
    • 모듈 만드는 법
    • 모듈 사용법
    • 패키지 만드는 법
    • 패키지 사용법
    • __init__.py

    모듈(Module)과 패키지(Package)

    함수와 모듈 패키지는 위와같은 종속관계를 갖는다. 함수가 여러개 모여 모듈이 되고, 모듈이 여러개 모여 패키지를 이룬다. 함수는 .py 파일 내에서 def xxx로 정의된다. 모듈은 .py 파일이다. 그리고 여러개의 py파일을 가지고 있는 디렉토리가 패키지이다.

    • 함수 : def function_name() : 로 정의, .py 파일 내에 여러개 있다.
    • 모듈 : .py가 모듈. 한 패키지 안에 여러개의 모듈이 존재한다.
    • 패키지 : 프로젝트 디렉토리 아래에 py파일을 포함한 디렉토리가 패키지이다.

    모듈 만드는 법

    모듈 만드는 법은 간단하다. .py가 바로 모듈이기 때문이다. .py파일을 만들면 여러분은 바로 모듈을 만든 것이다.

    customerService.py 파일(모듈)을 만들어보자. 

    customers = []


    class Customer:
    id = ""
    name = ""


    def insert_customer(customer_id, customer_name):
    c = Customer()
    c.id = customer_id
    c.name = customer_name
    customers.append(c)


    def print_customer():
    for customer in customers:
    print("[" + customer.id + "] " + customer.name)

    참고로 파이참에서는 이렇게 생겼다. 프로젝트 바로 밑에 customerService.py를 생성하면 된다. customerService생성 후 insert_customer와 print_customer라는 함수 두개를 만들었다.

    모듈 사용법

     이렇게 만든 모듈을 사용하는 방법은 다음과 같다. helloworld.py에서 customerService모듈을 사용해보자.

    import customerService

    모듈을 가져오는 방법은 위처럼 import 키워드를 사용하는 것이다. 그럼 이제 모듈을 사용해보자.

    import customerService

    customerService
    .insert_customer("1", "fsoftwareengineer")
    customerService.print_customer() [1] fsoftwareengineer

    cusomterService 모듈의 함수를 이용하기 위해서는 customerService.<함수이름>를 사용하면 된다. 만약 customerService.을 사용하고 싶지 않고 insert_customer를 바로 이용하고 싶다면 어떻게 해야 좋을까?

    from customerService import insert_customer
    from customerService import print_customer

    insert_customer("1", "fsoftwareengineer")
    print_customer() [1] fsoftwareengineer
    이 때는 위처럼 'from <모듈이름> import <함수이름>'을 이용하면 함수 자체를 사용 할 수 있다.
    만약 이 패키지 이름이 너무 길어서 간략하게 cs로 사용하고 싶다면 이렇게 할 수 있다.
    import customerService as cs

    cs
    .insert_customer("1", "fsoftwareengineer")
    cs.print_customer() [1] fsoftwareengineer

    as 를 이용해 원하는 이름을 붙여 사용하는 것이다. 패키지 이름이 길 때 사용하기 편하다.

    패키지 만드는 법

    패키지는 디렉토리이다. 그냥 디렉토리를 만들면 된다. 파이참에서는 아래처럼 Python Package를 선택 할 수 있는데, 말이 Python Package이지 그냥 디렉토리이다.

    패키지 이름을 service라고 하고 customerService.py를 이 패키지로 옮겨보자.

    파이참에서 패키지를 만들면 __init__.py가 자동으로 생기는데 밑에서 사용 할 것이므로 그냥 둔다. 파이썬 3.3 이전 버전에서는 파이썬 패키지 안에는 __init__.py가 무조건 있어야 했지만 파이썬 3.3이후로는 없어도 된다고 한다. 아무튼 customerService,py만 패키지 아래로 옮겼다.

    패키지 사용법

    이제 패키지를 사용 해 보자. 패키지를 사용하는 방법은 다음과 같다.
    import service.customerService as cs

    cs.insert_customer("1", "fsoftwareengineer")
    cs.print_customer()

    'import <패키지이름>.<모듈이름>' 으로 모듈을 불러 올 수 있다. 이 키워드는 모듈을 불러오는 키워드 이므로 'from <패키지이름>.<모듈이름> import <함수이름>' 처럼 모듈 import시 가능한 모든 키워드를 사용 할 수 있다.

    여러개의 모듈을 한 패키지에서 가져오려면 어떻게 해야할까? 실습을 위해 service 패키지에 itemService.py를 넣어보자.

    itemService.py

    items = []


    class Item:
    id = ""
    name = ""


    def insert_item(item_id, item_name):
    item = Item()
    item.id = item_id
    item.name = item_name
    items.append(item)


    def print_items():
    for item in items:
    print("[" + item.id + "] " + item.name)

    helloworld.py에서 다음처럼 모듈들을 불러올 수 있다.

    import service.customerService as cs, service.itemService as iService

    cs.insert_customer("1", "fsoftwareengineer")
    cs.print_customer()
    iService.insert_item("1", "Item1")
    iService.print_items()

    또는

    import service.customerService as cs
    import service.itemService as iService

    cs.insert_customer("1", "fsoftwareengineer")
    cs.print_customer()
    iService.insert_item("1", "Item1")
    iService.print_items()

    __init__.py

     그렇다면 한 패키지에 있는 모든 모듈을 가져올 순 없을까? 그것은 바로 __init__.py를 이용해 가능하다. __init__.py를 열고 __all__ 이라는 리스트에 원하는 모듈 이름을 적어준다. 

    __all__ = [
    'customerService',
    'itemService',
    ]

    그리고 이 모듈을 사용하고 싶은 다른 모듈에서 아래처럼 'from <패키지이름> import *'을 적어주면 파이썬이 알아서 __init__.py를 찾아서 __all__리스트에 추가된 모듈들을 전부 import한다.  

    from service import *

    customerService.insert_customer("1", "fsoftwareengineer")
    customerService.print_customer()
    itemService.insert_item("1", "Item1")
    itemService.print_items()

    이 포스트를 통해서 파이썬에서 코드를 효율적으로 관리하기 위해 모듈과 패키지를 어떻게 사용하는지 알아보았다. 

    연습문제

     위의 예에서 customerService의 id가 insert_customer의 매개변수로 넘어왔다. 보통 id는 auto-generate을 사용하므로 이 insert_customer에서 id를 인자로 받지 말고, insert_customer안에서 random한 id(uuid)를 만들어 보자.

    • 사용해야 할 모듈이름 : uuid
    • uuid 모듈에서 사용해야 할 함수 이름: uuid4()
    • 고쳐야 할 파일 : customerService.py
    // 여기 모듈 추가
    customers = []


    class Customer:
    id = ""
    name = ""


    def insert_customer(customer_name):
    c = Customer()
    c.id = // 여기 고치기
    c.name = customer_name
    customers.append(c)


    def print_customer():
    for customer in customers:
    print("[" + str(customer.id) + "] " + customer.name)

    helloworld.py

    from service import *

    customerService.insert_customer("fsoftwareengineer") // 얘가 잘 실행되도록!
    customerService.print_customer()

    다 하고나면 github에 올려놓은 정답을 보고 비교 해보자. 정답 먼저 보지 말고 꼭 혼자 풀어봐라.

    댓글

f.software engineer @ All Right Reserved