[Python] 18. 패키지(package)

2023. 11. 7. 02:27·Programming Language/Python

패키지(package)


패키지란 무엇인가?


  • 패키지는 도트를 사용하여 파이썬 모듈을 계층적(디렉토리 구조)으로 관리할 수 있게 해줌

  • 모듈이름이 A.B인 경우에 A는 패키지 이름, B는 A 패키지의 모듈이 된다.

    game/
      __init__.py
      sound/
        __init__.py
        echo.py
        wave.py
      graphic/
        __init__.py
        screen.py
        render.py
      play/
        __init__.py
        run.py
        test.py
    • game, sound, graphic, play는 directory 이름
    • .py 파일은 모듈
    • game directory가 root directory임
    • sound, graphic, play는 sub directory임
  • 패키지 구조로 파이썬 프로그램을 만들면 공동작업이나 유지보수 등 여려면에서 유리

  • 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용 가능

패키지 만들기


  • 위 예시처럼 디렉터리를 만들고, 각 디렉터리 마다 __init__.py 생성 하고 기타 파일 만들기

    game/
      __init__.py
      sound/
        __init__.py
        echo.py
        wave.py
      graphic/
        __init__.py
        screen.py
        render.py
      play/
        __init__.py
        run.py
        test.py
    
    # echo.py
    
    def echo_test():
        print("echo")
    
    # render.py
    
    def render_test():
        print("render")
  • echo 모듈 import 하여 실행하기

import game.sound.echo
game.sound.echo.echo_test()
  • echo 모듈이 있는 디렉터리까지 from... import 하여 실행

    from game.sound import echo
    echo.echo_test()
  • echo 모듈의 echo_test 함수를 직접 Import하여 실행

    from game.sound.echo import echo_test
    echo_test()
  • 루트 디렉터리만 import 하여 서브 디렉터리의 모듈 함수를 사용할 수 없다.

    • 루트 디렉터리에 있는 모듈 또는 __init__.py에 정의한 것만 참조할 수 있음
    # error occured
    import game
    game.sound.echo.echo_test()
  • 도트 연산자를 통해 import 할 때 (import a.b.c) 마지막 항목인 c는 반드시 모듈 또는 패키지여야 함

    # error occured
    import game.sound.echo.echo_test

__init__.py의 용도

  • 해당 디렉토리가 패키지의 일부임을 알려줌

  • __init__.py가 없으면 패키지로 인식하지 않는다.

  • example

    from game.sound import *
    echo.echo_test() # error
    • 에러가 발생한 이유 : sound 디렉토리의 모듈 *를 import할 때 import 할 수 있는 모듈을 알려줘야함.

      • __init__.py 파일에 __all__ 변수를 설정하고 import 할 수 있는 모듈을 정의해야 한다.

      • __all__ = ['echo', '추가로 더있다면 추가']

      • sound 디렉토리에 * 기호를 사용하여 import 할 경우에 이곳에 정의된 echo 모듈만 import 된다는 의미

      • from game.sound.echo import *는 __all__과 상관 없이 import 됨.

relative 패키지

  • grpahic 패키지의 render.py 모듈에서 sound디렉토리의 echo.py 모듈을 사용하고 싶을 때

    # render.py
    from game.sound.echo import echo_test
    
    def render_test():
      print("render")
      echo_test()
  • 조금 더 relative하게 import 해보고 싶다면

    # render.py
    from ..sound.echo import echo_test
    • ..(relative한 접근자) 사용 : 부모 디렉터리 의미

      • graphic과 sound의 디렉토리의 depth가 같으므로 가능한 것

      • 모듈안에서만 사용해야 하고, 인터프리터에서는 절대 사용 X(에러 발생)

참조) Do it! 점프 투 파이썬 (박응용 지음)

'Programming Language > Python' 카테고리의 다른 글

[Python] 20. 내장 함수(Built-in-function)  (0) 2023.11.07
[Python] 19. 예외처리(Exception Handling)  (0) 2023.11.07
[Python] 17. 모듈(module)  (0) 2023.11.07
[Python] 16. 클래스(Class), 상속(inheritance)  (0) 2023.11.06
[Python] 15. 파일 입출력(FILE Input/Output)  (0) 2023.11.06
'Programming Language/Python' 카테고리의 다른 글
  • [Python] 20. 내장 함수(Built-in-function)
  • [Python] 19. 예외처리(Exception Handling)
  • [Python] 17. 모듈(module)
  • [Python] 16. 클래스(Class), 상속(inheritance)
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Spring
        • MVC
        • DB
        • 핵심 원리
        • JPA
      • WEB
        • HTML
        • CSS
        • HTTP
        • Application
      • Computer Science
        • Network
        • Database
        • OS
        • 시스템 프로그래밍
        • 컴퓨터구조
      • Algorithm
        • Divide&Conquer
        • Sort
        • Greedy
        • DP
        • Backtracking
        • NP-Complete
        • Graph
      • Data Structure
        • 자료구조
        • C++ STL
        • Java Collection
      • 소프트웨어 공학
        • 시험 공부 정리
        • Theorem
      • Programming Language
        • Python
        • Java
        • C
        • C++
        • Rust
        • Theory
      • Unix_Linux
        • Common
      • React
      • PS
        • BOJ
        • Tip
        • 프로그래머스
        • CodeForce
      • Book Review
        • Clean Code
      • Math
        • Linear Algebra
      • AI
        • DL
        • ML
        • DA
        • Concepts
      • 우아한테크코스
        • 프리코스
      • Project Review
      • LegacyPosts
      • Android
      • Apple
        • Mac
        • IPhone
        • IPad
      • 모니터
      • Diary
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
lumana
[Python] 18. 패키지(package)
상단으로

티스토리툴바