[python] module, pakage
A A

목차

    728x90

    Modules

    https://docs.python.org/3/tutorial/modules.html

    6. Modules

    If you quit from the Python interpreter and enter it again, the definitions you have made (functions and variables) are lost. Therefore, if you want to write a somewhat longer program, you are bett...

    docs.python.org


    python interpreter를 종료하고 재실행하면, 이전에 정의하였던 함수나 변수가 사라진다.
    내용이 긴 프로그램을 작성하기 위해 텍스트 편집기를 이용하여, interpreter에 입력할 내용을 준비하고, 해당 내용을 실행하는 것이 좋다.
    이를 create a script(스크립트 작성) 라 하며,  유지 관리를 위해 여러 파일로 분할하는 것이 좋다.
    또한 이 파일들을 관리하면서, 여러 프로그램에서 각 정의들을 복사하지 않고, 그대로 사용할 수 있다.

    이를 지원하기 위해 python은 정의를 파일에 저장하고, 사용할 수 있는 방법을 제공한다.
    이러한 파일들을 module 이라고 하며, 각 module은 다른 module 들을 가져올 수 있다.
    모듈은 .py 확장자를 가진 파일을 의미한다.


    # math_utils.py
    def add(x, y):
        return x + y
    
    def multiply(x, y):
        return x * y

    # main.py
    import math_utils
    
    print(math_utils.add(2, 3))      # 5
    print(math_utils.multiply(4, 5)) # 20

    import Module

    ref : https://docs.python.org/3/reference/simple_stmts.html#the-import-statement

    7. Simple statements

    A simple statement is comprised within a single logical line. Several simple statements may occur on a single line separated by semicolons. The syntax for simple statements is: Expression statement...

    docs.python.org

    import module_name          # 전체 모듈
    import module_name as m     # 별칭
    from module_name import func1, func2
    from module_name import *   # 모든 요소 

    기본 import 문은 두단계로 실행된다.

    1. module을 찾아 필요한 경우 로드하고 초기화를 진행.
    2. 명령문이 발생하는 범위에 대한 로컬 네임스페이스에서 이름을 정의한다. (import)
    3. 모듈을 성공적으로 검색되었다면 세가지 방법중 하나를 통해 로컬 네임스페이스에서 사용할 수 있다.
      - 모듈 이름 뒤에 as 가 있는 경우에 as 뒤의 별칭을 통해 모듈에 직접 바인딩
      - 모듈 이름 뒤에 as 가 없는 경우 모듈이 최상위 모듈일 때 , 모듈 이름은 가져온 모듈에 대한 참조로 로컬 네임스페이스에 바인딩.
      - 모듈 이름 뒤에 as 가 없는 경우 모듈이 최상위 모듈이 아닐 때, 해당 모듈을 포함하는 최상위 패키지 이름이 로컬 네임 스페이스에 최상위 패키지에 대한 참조로 바인딩.
         (이 경우 가져온 모듈은 직접 접근하는 대신 정규화된 이름을 사용하여 접근해야함.)

    from 절의 양식은 조금 더 복잡한 프로세스를 사용한다.
    1. from 절에 지정된 모듈을 찾아 로드하고 초기화를 진행.
    2. import 절에 지정된 식별자에 대해
       - 가져온 모듈에 해당 이름의 속성이 있는지 확인.
       - 그렇지 않은 경우 해당 이름을 가진 하위 모듈을 가져와서 해당 속성이 있는지 확인.
       - 해당 속성을 찾을 수 없는 경우 importError 발생.
    3. 해당 식별자에 대한 참조가 로컬 스페이스에 저장되고, as 가 있는 경우 해당 이름을 사용함. 아닐 경우 속성 이름을 사용.



    Pakages

    https://docs.python.org/3/tutorial/modules.html#packages

    6. Modules

    If you quit from the Python interpreter and enter it again, the definitions you have made (functions and variables) are lost. Therefore, if you want to write a somewhat longer program, you are bett...

    docs.python.org

    sound/                          Top-level package
          __init__.py               Initialize the sound package
          formats/                  Subpackage for file format conversions
                  __init__.py
                  wavread.py
                  wavwrite.py
                  aiffread.py
                  aiffwrite.py
                  auread.py
                  auwrite.py
                  ...
          effects/                  Subpackage for sound effects
                  __init__.py
                  echo.py
                  surround.py
                  reverse.py
                  ...
          filters/                  Subpackage for filters
                  __init__.py
                  equalizer.py
                  vocoder.py
                  karaoke.py
                  ...

    패키지는 ".모듈명"을 사용하여 python 모듈 네임스페이스를 구성한다.
    모듈을 사용하면서, 각 모듈(파일)의 변수명에 신경쓰지 않아도 되는 것 처럼,
    다중 모듈 패키지의 작성자가 서로의 모듈 이름을 신경쓸 필요가 없다.


    import Pakage
    import sound.effects.echo

    이렇게 하면, 하위 모듈이 로드된다.
    하지만, sound.effects.echo 전체 이름으로 참조해야한다.
    예를 들어 해당 모듈에 echoprint()라는 함수가 있다면,
    echo.echoprint()가 아닌 sound.effects.echo.echoprint() 라고 사용해야한다.
    이에 대해 불편한 점을 바로 볼 수 있을 것이다.
    간단하게 ecgo.echoprint() 를 사용하기 위해서는 이렇게 할 수 있다.

    from sound.effects import echo

    이렇게 하면 하위 모듈 echo 가 로드되며 , 패키지 접두사 없이, echo.echoprint() 를 사용할 수 있다.
    또는 이렇게 할 수도 있다.

    from sound.effect.echo import echoprint
    
    echoprint()

    이렇게 직접 원하는 함수나 변수를 직접 가져와서  직접 사용할 수도 있다.
    echo 모듈에서 echoprint()가 정의되어 있지 않다면, 항목을 찾지 못해 ImportError가 발생한다.

    dot 표기법 주의사항

    import pakage.module.submodule 에서 점 표기법을 활용할 수 있는 범위는 패키지와 모듈이며, 마지막에 오는 submodule에는 변수나 함수가 올 수 없다.

    from 패키지.모듈(or 모듈) import *

    import * 는 해당 모듈의 모든 것을 의미하며, 사용에 있어서 문제가 없지만,
    prodcution code 에서는 나쁜 관행으로 간주된다.


    상위 패키지 참조
    from . import echo
    from .. import formats
    from ..filters import equalizer

    패키지 내의 상위나 그 상위에 대한 표기를 다음과 같이 나타낼 수 있다.
    상대적인 경로를 통한 가져오기는, 현재 모듈의 위치를 기준으로 한다.
    "__main__" 의 이름을 가진, python 어플리케이션의 메인 모듈로 사용할 모듈은 항상 절대적 가져오기를 사용해야한다.


    dir(Module)

    dir() 의 함수는 해당 객체의 모든 속성과 메서드들을 리스트로 반환하는 함수이다.

    기본 dir() 사용
    a = 10
    b = "hello"
    print(dir())
    # ['__builtins__', 'a', 'b']
    # 인자 없는 dir 은 현재 스코프에서 호출 가능한 목록을 출력
    
    print(dir("hello"))
    # ['__add__', '__class__', '__contains__', ..., 'upper', 'zfill']
    # 인자에 객체를 넣게 되면, 해당 객체의 속성, 메서드, attribute를 알 수 있음.
    dir()의 사용 주의

    - 매직 메서드 까지 포함하여, 나온다.
    - 단순히 이름만 나오며 필요한 정보만 추려 사용한다 . help() 사용
    - __dir__()이 오버라이드 되어있을 수 있기 때문에 실제 객체가 가진 속성과 상이 할 수 있다.

    dir(Module) 기본사용
    import math
    print(dir(math))
    
    #['__doc__', '__loader__', '__name__', ..., 'cos', 'sqrt', 'tan']

    모듈에 어떤 함수나 변수, 클래스 등 있는 지 알 수있다.

    dir(Module) 의 사용 주의
    from math import sqrt
    
    print(dir())        
    # ['__builtins__', 'sqrt']
    # math를 import 한 것이 아니라 현재 스코프에 한해 출력된다.
    
    print(dir(math))    
    # 오류! math를 import 안 했기 때문

    - 위 코드와 같이 모듈을 import 하여야 인자를 넣어 해당 모듈에 대한 정보를 알 수 있다.
    - __doc__ , __name__ 같은 내부 정보도 함께 나온다.
    - 어떤 모듈은 __getattr__() 로 동적으로 속성을 생성하는 경우 나오지 않는 경우가 있을 수 있다.
    - 모듈 이름을 별칭으로 지정한 경우 원래 이름이 안니 별칭을 통해 사용해야 한다.

    'Development > Python' 카테고리의 다른 글

    [python] if __name__ == "__main__" :  (0) 2025.05.15
    [python] math, random, platform  (2) 2025.05.15
    python : Iterator, Generator  (0) 2025.03.26
    python : 자료형 . 기본 자료형 및 내장 자료형  (0) 2025.03.20
    python : 변수  (0) 2025.03.19
    Copyright 2024. GRAVITY all rights reserved