파이썬 모듈 (2) 파이썬 doc 톺아보기 2

Sanghun Moon·2021년 7월 18일
0

python

목록 보기
2/4

앞서서 모듈에 대해서 살펴봤다.
패키지는 모듈과의 성격이 유사하여 비슷하게 사용이 되지만, 파이썬 doc을 이용하여

패키지

패키지는 "점으로 구분된 모듈 이름" 을 써서
파이썬의 모듈 이름 공간을 구조화하는 방법

ex. A.B → A 라는 이름의 패키지에 있는 B 라는 이름의 서브 모듈

모듈의 사용 → 다른 모듈의 저자들이 서로의 전역 변수 이름들을 걱정할 필요 없게 만듦

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
              ...

패키지를 임포트할 때, 파이썬은 sys.path 에 있는 디렉토리들을 검색하면서 패키지 서브 디렉토리를 찾는다

파이썬이 디렉토리를 패지키로 취급하기 위해서는 __init__.py 파일이 필요

이렇게 하면 string 처럼 흔히 쓰는 이름의 디렉토리가, 의도하지 않게 모듈 검색 경로의 뒤에 등장하는 올바른 모듈들을 가리는 일을 방지

가장 간단한 경우 → __init__.py 는 그냥 빈 파일이지만

패키지의 초기화 코드를 실행하거나 뒤에서 설명하는 __all__ 변수를 설정할 수도 있다

패지키 사용자는 패키지로부터 개별 모듈을 import 할 수 있다

import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)

from package import item 사용시

item 은 패키지의 서브 모듈 (또는 서브 패키지) 일 수도 있고

함수, 클래스, 변수 등 패키지에 정의된 이름들일 수도 있음을 주의

import 문은 먼저 item이 패키지에 정의되어 있는지 검사

그렇지 않으면 모듈이라고 가정하고 로드 시도

→ 찾지 못한다면, ImportError 예외 발생

import item.subitem.subsubitem 와 같은 문법을 사용할 때

마지막 제외 항목 → 반드시 패키지

마지막 항목 → 모듈이나 패키지가 될 수 있지만

(클래스, 함수, 변수 등이 될 수는 없다)


패키지에서 * import 하기

from sound.effects import * 라고 쓰면 어떤 일이 발생할까?

(이상적으로는) 어떻게든 파일 시스템에서 패키지에 어떤 모듈들이 들어있는지 찾고,

→ 그것을 모두를 import 하기를 희망

단점

  • 시간이 오래 걸리고
  • 서브 모듈을 import 함에 따라 어떤 서브 모듈을 명시적으로 import 할 경우만 일어나야 하는 원하지 않는 부수적 효과 발생

해결책

  • 패키지 저자가 패키지의 index을 명시적으로 제공
  • 패키지의 __import__.py 코드가 __all__ 이라는 이름의 목록을 제공하면,

이것을 from package import * 를 만날 때 import해야만 하는 모듈 이름들의 목록으로 받아들인다

새 버전의 패키지를 출시할 때, 이 목록을 최신 상태로 유지하는 것은 패키지 저자의 책임

패키지 저자가 패키지에서 * 를 import 하는 용도가 없다고 판단하면, 지원하지 않아도 된다

# sound/effects/__init__.py
__all__ = ["echo", "surround", "revers"]
  • 이것은 from sound.effects import *sound.effects 패키지의 세 서브 모듈들을 import 하게 됨을 의미

__all__ 이 정의되지 않으면

문장 from sound.effects import * 은 패키지 sound.effects모든 서브 모듈들을 현재 이름 공간으로 임포트 하지 않는다

이것은 오직 패키지 sound.effects 가 임포트 되도록 만들고

그 패키지가 정의하는 이름들을 import

이 이름들은 __init__.py 가 정의하는 모든 이름을 포함

이 이름들에는 사전에 import 문으로 명시적으로 로드된 패키지의 서브 모듈들 역시 포함

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

이 예에서, echo 와 surround 모듈이 현재 이름 공간으로 import

어떤 모듈이 import * 를 사용할 때 특정 패턴을 따르는 이름들만 export 하도록 설계되었다 하더라도, 프로덕션 코드에서는 여전히 좋지 않은 사례로 여겨진다

from package import specific_submodule 을 사용하는데 잘못된 것은 없다는 것 기억

import 하는 모듈이 다른 패키지에서 같은 이름의 서브 모듈을 사용할 필요가 없는 한 권장되는 표기법

패키지 내부 간의 참조

패키지가 서브 패키지들로 구조화될 때

이웃 패키지의 서브 모듈을 가리키는데 import 사용 가능

예를 들어,

모듈 sound.**filters**.vocoder

sound.**effects** 패키지의 echo 모듈이 필요하다면,

from sound.effects import echo 를 사용할 수 있다

상대 import 를 사용할 수도 있는데, from module import name 형태로 import 문 사용

import는 상대 import에 수반되는 현재와 부모 패키지를 가리키기 위해 앞에 붙는 점 사용

from . import echo
from .. import formats
from ..filters import equalizer

상대 import 가 현재 모듈의 이름에 기반을 둔다는 것을 주의

메일 모듈의 이름은 항상 "main" 이기 때문에

파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대 임포트를 사용해야 한다

여러 디렉토리에 있는 패키지

__path__

이것은 패지키의 init.py 파일을 실행하기 전에,

이 파일에 들어있는 디렉토리의 이름을 포함하는 리스트로 초기화

이 변수는 수정 가능

→ 그렇게 하면 그 이후로 패키지에 포함된 모듈과 서브 패키지를 검색하는 데 영향을 준다

(패키지에서 발견되는 모듈의 집합을 확장하는 데 사용)

# import effects
from effects import *
# from effects import echo

if __name__ == "__main__":
    print("hello world")
    print(__name__)

마무리

지금까지 모듈과 패키지의 파이썬 문서 번역에 대해서 살펴봤다
출처 : https://docs.python.org/ko/3/tutorial/modules.html

profile
Python Server Developer

0개의 댓글