모듈과 패키지

이 노트북은 제이크 반더플라스(Jake VanderPlas)의 A Whirlwind Tour of Python(OReilly Media, 2016)를 기반으로 만들어졌습니다. 이 내용은 CC0 라이센스를 따릅니다. 전체 노트북의 목록은 https://github.com/rickiepark/WhirlwindTourOfPython 에서 볼 수 있습니다.

< 제너레이터 | 목차 | 문자열과 정규 표현식 >

 

다양한 작업에 파이썬을 유용하게 만드는 한가지 특징은 “배터리가 포함되어(battery included)” 있다는 사실입니다. 즉 파이썬의 표준 라이브러리는 다양한 작업에 유용한 도구들을 포함하고 있습니다. 이 라이브러리 위에 더 특화된 기능을 제공하는 서드파디 도구와 패키지들의 거대 생태계가 구축되어 있습니다. 여기서는 표준 라이브러리 모듈을 임포팅하고 서드파티 모듈을 설치하기 위한 도구와 자신만의 모듈을 만드는 법에 대해 설명하겠습니다.

모듈 로딩: import 문

내장 모듈과 서드파티 모듈을 로딩하기 위해 파이썬은 import 문을 제공합니다. 이 명령을 사용하는 몇 가지 방법이 있는데 권장하는 것과 그렇지 않은 것까지 간단하게 살펴 보겠습니다.

명시적 모듈 임포팅

명시적으로 모듈을 임포팅하면 모듈의 컨텐츠를 네임스페이스 아래 유지시킵니다. 네임스페이스는 모듈의 내용을 “.“으로 참조할 수 있습니다. 예를 들어 내장 math 모듈을 임포트하고 \pi 의 코사인 값을 계산합니다:

import math
math.cos(math.pi)
-1.0

별칭을 사용한 명시적 모듈 임포팅

모듈 이름이 길면 모듈의 컨텐츠를 사용하기 위해 매번 전체 모듈 이름을 적기 불편합니다. 이런 이유로 보통 “import ... as ...” 패턴을 사용해 네임스페이스의 짧은 별명을 만듭니다. 예를 들어 데이터 과학 분야에서 유명한 서드파티 패키지인 넘파이(NumPy, Numerical Python)는 관례적으로 np 별칭을 사용해 임포트합니다:

import numpy as np
np.cos(np.pi)
-1.0

명시적 모듈 컨텐츠 임포팅

때로는 모듈 네임스페이스를 임포팅하는 것대신 모듈에서 몇 개의 컨텐츠만 임포팅하고 싶을 수 있습니다. 이럴 때는 “from ... import ...” 패턴을 사용합니다. 예를 들어, math 모듈에서 cos 함수와 pi 상수만을 임포트할 수 있습니다:

from math import cos, pi
cos(pi)
-1.0

모듈 컨텐츠 묵시적 임포팅

마지막으로 가끔 모듈 컨텐츠 전체를 로컬 네임스페이스로 임포팅하는게 편리할 때가 있습니다. 이런 경우에는 “from ... import *” 패턴을 사용합니다:

from math import *
sin(pi) ** 2 + cos(pi) ** 2
1.0

이 패턴은 사용한다고 해도 삼가해서 사용해야 합니다. 이런 임포팅은 이따금 원치 않게 함수 이름을 덮어 쓸 수 있고 묵시적인 임포팅은 무엇이 바뀌었는지 찾기 어려운 문제가 있습니다.

예를 들어 파이썬은 여러 연산에 사용할 수 있는 sum 함수가 있습니다:

help(sum)
Help on built-in function sum in module builtins:

sum(iterable, start=0, /)
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers

    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may
    reject non-numeric types.

이 함수를 사용해 특정 값에서 시작하는 시퀀스의 합을 계산할 수 있습니다(-1에서부터 시작해 보겠습니다):

sum(range(5), -1)
9

이제 numpy에서 *를 임포팅하고 같은 함수 이름이 겹칠 때 어떤 일이 생기는지 보겠습니다:

from numpy import *
sum(range(5), -1)
10

결괏값이 1만큼 커졌습니다! 이런 이유는 import * 문장이 내장 sum 함수를 numpy.sum 함수로 바꾸었기 때문입니다. 두 함수는 다르며 전자는 -1부터 시작해 range(5)를 더하지만, 후자는 마지막 축(-1의 의미)을 따라 range(5)를 더합니다. 이것이 “import *“를 사용했을 때 조심하지 않으면 일어날 수 있는 상황입니다. 그래서 작업에 대해 정확히 알고 있지 않다면 이런 방식은 피하는 것이 좋습니다.

파이썬 표준 라이브러리 임포팅

파이썬의 표준 라이브러리는 많은 내장 모듈을 담고 있으며 파이썬 문서에서 전체를 볼 수 있습니다. 이들은 모두 import 문으로 임포팅할 수 있고 이전 섹션에서처럼 도움말 함수를 사용해 살펴 볼 수 있습니다. 둘러 보고 익혀둘만한 극히 일부 모듈을 다음에 나열하였습니다:

  • ossys: 파일 디렉토리 구조의 탐색과 쉘 명령 실행을 포함한 운영체제 시스템과의 인터페이싱 도구
  • mathcmath: 실수와 복소수에 대한 수학 함수와 연산들
  • itertools: 반복자와 제너레이터를 만들고 다루기 위한 도구들
  • functools: 함수형 프로그래밍을 지원하기 위한 도구들
  • random: 유사 난수 생성을 위한 도구들
  • pickle: 객체를 저장하고 디스크에서 로딩하는 등의 객체 지속성을 위한 도구들
  • jsoncsv: JSON과 CSV 포맷의 파일을 읽기 위한 도구들
  • urllib: HTTP와 다른 웹 요청을 위한 도구들

이런 모듈의 설명과 다른 많은 것들을 파이썬 표준 라이브러리 문서에서 볼 수 있습니다: https://docs.python.org/ko/3/library/

서드파티 모듈 임포팅

파이썬을 데이터 과학 세계에서 특히 유용하게 만드는 한 가지는 서드파티 생태계입니다. 이 모듈들은 내장 모듈처럼 임포팅할 수 있지만 먼저 모듈을 시스템에 설치해야 합니다. 이런 모듈의 표준 저장소는 파이썬 패키지 인덱스(줄여서 PyPI)로 웹 주소는 http://pypi.python.org/ 입니다. 편리하게 파이썬은 PyPI에 있는 패키지를 추출하여 자동으로 설치하는 pip(재귀적 약어인 “pip installs packages”를 의미합니다) 프로그램을 기본으로 제공합니다(만약 파이썬 버전 2를 사용하면 pip를 별도로 설치해야 합니다). 예를 들어 제가 만든 supersmoother 패키지를 설치하려면 다음과 같은 명령을 입력하는 것이 전부입니다:

$ pip install supersmoother

이 패키지의 소스 코드가 자동으로 PyPI 저장소에서 다운로드되고 기본 파이썬 경로에 설치됩니다(이 컴퓨터에서 적절한 권한이 있다고 가정합니다).

PyPI와 pip 인스톨러에 대해 더 알고 싶다면 http://pypi.python.org/ 문서를 참고하세요.

 

< 제너레이터 | 목차 | 문자열과 정규 표현식 >

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

w

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.