Python Module & Packages

빈코더·2021년 1월 24일
0

파이썬

목록 보기
5/7
post-thumbnail

Python Module & Packages

Python Module & Packages에 대해서 알아보자.

파이썬에서 모듈은 변수나 함수 그리고 클래스 등을 모아놓은 파일이다.

따로 모듈로 모아놓은 이유는 다음과 같다.

  • 다른 파일에서 재사용이 가능하게 하고
  • 전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리를 하기 위해서

예를 들어, List의 총 요소 개수를 알고 싶으면 len 함수를 사용하면 된다.

my_list = [1, 2, 3, 4, 5]
my_list_length = len(my_list)
 
print(my_list_length)

하지만 len 함수를 직접 구현한적은 없다.

파이썬에서 이미 모듈로 구현해놓았음으로 그냥 가져다 쓰면 되는 것이다.

이렇게 모듈은 다른 사람들이 이미 만들어놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있다.

Module 만들기

module을 만드는 방법은 간단하다.

단순히 파일을 만든후 그 안에 재사용 하고 싶은 함수나 클래스 혹은 변수를 구현하면 된다.

## my_module.py
my_module_var = 7
 
def my_module_func():
    return "Hello!"
 
class MyModuleClass:
    pass

그 후 단순히 다른 파일에서 불러와 사용하면 된다.

모듈을 불러와 (import) 사용하기 위해서는 import라는 키워드를 사용하면 된다.

`import <모듈 이름>`

주의할점은 모듈을 import 할때 파일 확장자인 ".py" 는 제외하고 파일 이름만 사용해서 import 해야 한다.

import my_module

예를 들어, my_module 모듈의 my_module_func 함수를 호출하고 싶으면 다음 처럼 할 수 있다.

my_module.my_module_func()

이렇게 모듈 이름을 앞에 붙여줘야 하는 이유는, 그래야 파이썬이 어느 파일을 봐야 해당 함수를 찾을수 있는지 알 수 있기 때문이다. 만일 모듈 이름을 안붙어주면 파이썬은 모듈의 파일을 보지 않고 해당 파일에서만 함수를 찾을려고 한다. (그리고 못찾을거기 때문에 에러가 난다). 이러한 구조를 "name space" 라고 한다.

이름의 공간 혹은 영역을 알려주기 때문입니다.

## main.py
import my_module
 
print(my_module.my_module_var)
 
my_module.my_module_func()
 
my_module_class = my_module.MyModuleClass()

Alternative ways to import modules

import 키워드 외에 from import 키워드를 사용해서 모듈을 불러들일수 있다.

from <모듈 이름> import <함수/변수/클래스1>, <함수/변수/클래스2>, ..., <함수/변수/클래스N>

예를 들어, my_module 모듈에서 my_module_func 함수와 my_module_var 변수를 import 하고자 한다면 다음처럼 할 수 있습니다.

from my_module import my_module_func, my_module_var
 
print(my_module_var)
my_module_func()

from import 키워드를 사용하여 모듈을 불러들이는 경우 모듈 이름을 붙이지 않고 곧바로 원하는 함수나 변수 그리고 클래스를 호출할 수 있다.

모듈에서 사용하는 것이 명확할때 from import 를 사용하면 편리하다.

다음 처럼 별표( * )를 사용하면 해당 모듈의 모든 요소가 곧바로 import된다.

from my_module import *
 
print(my_module_var)
my_module_func()

하지만 이렇게 하는 것은 권장되지 않는다. 왜냐하면 local scope를 가지고 있는 다른 변수/함수/클래스 들과 이름 충돌이 날 수 있는데, 만일 이름 충돌이 일어났을 경우 알기가 쉽지 않을수 있기 때문이다.

Import As

만일 여러 모듈을 import 하게 되면 이름 충돌이 날 수도 있다. 예를 들어 서로 다른 모듈에서 동일한 이름의 함수가 있을 수도 있는것이다. 혹은 원하는 모듈의 요소의 이름이 너무 길수도 있다. 이러한 경우 import as 키워드를 사용해서 새로운 이름을 주어서 사용할 수 있다.

from my_module  import my_func as f1
from my_module2 import my_func as f2
from my_module3 import function_with_name_too_long as f3
 
f1()
f2()
f3()

module 이름도 as 를 사용하여 새로운 이름을 줄 수 있다.

Packages

Package는 module과 마찬가지로 다른 파일에서 불러와서 사용하는 개념이다.

차이점은 module보다 더 크고 복잡한 코드라는 점이다.

앞서 보았듯이 module은 단순한 파이썬 파일이다.

그러나 어떠한 module들은 코드의 양이 너무 커서 한 파일에 다 넣기에 비효율적일수다.

그러할 경우 여러 파일에 나누어서 코드를 관리하는것이 효과적일 것이다.

이렇게 여러 파일에 나누어져 있는 코드들도 다른 곳에서 하나의 module로 불러와서 사용할 수 있도록 해주는것이 package이다.

Package는 파이썬 파일들로 이루어져 있는 디렉토리(directory)가 하나의 package가 된다. 그리고 디렉토리 이름이 package 이름이 된다.

Package는 일반 모듈 처럼 import 하여 사용할 수 있다. 다만 차이점은 클래스 객체를 사용할때 처럼 "dot notation" 으로 해당 package의 원하는 모듈을 import 하면 된다.

import pkg.mod1
from pkg.mod2 import func2
 
pkg.mod1.func2()
func2()

Package Initialization

가끔은 package가 import 될때 초기 설정을 해줘야 할때가 있다.

파이썬은 __init__.py 파일을 통해 package 초기 설정을 가능하게 해준다.

    (pkg directory)
    - __init__.py
    - mod1.py
    - mod2.py

일반적으로 다음 사항들을 할 수 있다.

  • Import 할때 경로의 총 길이 줄여주기
  • Package에서 import 할 수 있는 변수/함수/클래스 제한하기
  • 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들

먼저 import 할때 경로의 총 길이 줄여주기에 대해서 보자.

현재 pkg에서 mod1의 func2 라는 함수를 import 하여 사용하기 위해서는 다음과 같이 해야한다.

import pkg.mod1
 
pkg.mod1.func2()

func2 함수를 호출 할때마다 매번 모든 경로를 다 타입해줘야 하기때문에 번거롭다.

함수 이름을 곧바로 호출 할 수 있게 하면 편할것 같다.

다행히도 __init__.py 파일을 통해 함수의 경로를 줄여줄 수 있다. 방법은 아주 간단하다.

__init__.py 파일에 먼저 한번 import 해주면된다.

# __init__.py
from .mod1 import func2
# main.py
from pkg import func2
 
func2()

init.py 파일을 사용해서 import 할 수 있는 변수/함수/클래스를 제한할 수 있다.

예를 들어 모듈의 모든 함수가 다 외부로 노출될 수 있는건 아닐수 있다. 내부적으로만 사용되어야 하는 함수도 있을수 있는데, 이러한 함수가 package 외부에서 import되어 사용되는 것을 막기 위해서는 __all__ 변수를 지정해 줄 수 있다.

package를 통해 import 될 수 있는 요소들은 모두 __all__ 변수를 통해 정의 된다.

그리고 __all__ 변수의 default 값은 모든 함수/변수/클래스 이다.

그러므로 __all__ 변수를 따로 정의해줌으로 import 될 수 있는 요소들을 제한할 수 있는 것이다.

__all__ 변수는 string 값의 요소를 가지고 있는 list 이다 (list of strings).

그러므로 import 되길 원하는 요소들을 string으로 list에 선언해주면 된다.

# __init__.py
from .mod1 import func2
from .mod2 import func3
 
__all__ = ['func2', 'func3']
# main.py
from pkg import *
 
func2()
func3()
func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.

다른 사람의 package 사용하기

다른 사람이 만들 package를 import 하여 사용하기 위해서는 먼저 package를 설치를 해야 한다.

예를 들어, Django 라는 package를 사용하기 위해서는 먼저 설치를 해야한다.

파이썬에서 package를 설치하는 일은 매우 간단하다 (일반적으로. 간단하지 않은 package도 있다).

PIP 라는 툴을 사용하면 된다. PIP는 파이썬의 package manager 이다. 파이썬을 설치하면 같이 설치가 되며 pip은 터미널에서 다음 명령어를 사용하면 된다.

pip install Django 
profile
미래의 리눅스 토발즈

0개의 댓글