Python - Modules

황인용·2019년 12월 12일
0

Python

목록 보기
31/44

Modules & Packages

파이썬에서 module은 변수나 함수 그리고 클래스 등을 모아놓는 파일이다.
따로 모아놓는 이유는 다음과 같다.

  • 다른 파일에서 재사용이 가능하도록
  • 전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리하도록
# built-in module len()함수 
my_list = [1, 2, 3, 4, 5]
my_list_length = len(my_list)

print(my_list_length)

위에서 len()함수는 코드내 직접 만든적이 없는 함수이다. 즉, 파이썬에서 이미 모듈로 구현해 놓은 함수이다. 따라서 len()함수 또한 미리 만들어진 module 그리고 해당 package에서 가져다가 사용하는 것이다.

Module 만들기

Moduel을 만드는 것을 어렵지 않다
단순히 파일을 만든 후 그 안에 재사용하고 싶은 함수나 클래스 혹은 변수등을 구현하면 된다.

[파일명 : my_module.py]

## my_module.py
my_module_var = 7

def my_module_func():
    return "Hello!"

class MyModuleClass:
    pass

그 이후 위 module이 필요한 파일에서 해당 파일을 import해오면 된다. import는 import 키워드를 사용한다.

import <모듈 이름>

그리고 필요한 모듈에서 사용하고자 하는 변수/함수/클래스가 있다면 다음과 같이 불러오면 된다.

<모듈 이름>.<모듈에서 사용하길 원하는 변수/함수/클래스 이름>

예를 들어 my_module의 my_module_func 함수를 호출한다면 다음과 같이 호출한다.

my_module.my_module_func()

[파일명 : main.py]

import my_module

print(my_module.my_module_var)

my_module.my_module_func()

my_module_class = my_module.MyModuleClass()

image.png
다시 정리하면,

  1. 원하는 모듈을 import 키워드를 사용하여 불러온다. 그럼으로 파이썬이 모듈을 해당 파일과 연결시키게 된다.
  2. 그 후 연결된 모듈에서 원하는 변수/함수/클래스 를 사용하면 된다. 다만 해당 모듈 이름과 연결해서 호출을 해줘야 파이썬이 어느 파일에서 해당 변수/함수/클래스 를 찾을 수 있는지 알 수 있게된다.

Alternative ways to import modules

import 키워드 외에 from import 라는 키워드를 사용하여 module을 불러들일수 있다.

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()

만약 my_module에서 모든 변수나 함수 그리고 클래스를 호출하고자 한다면 '*'를 import하면 된다.

from my_module import *

print(my_module_var)
my_module_func()

Import As

만일 '*'를 사용하여 또는 여러 파일에서 module 가져온다면 이름이 충돌날 수도 있다. 따라서 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를 사용하여 새로운 이름으로 지정할 수 있다

import my_module as m1

m1.my_module_func()

Packages

Package는 module과 마찬가지로 다른 파일에서 불러와서 사용하는 개념이다. 차이점은 module보다 더 크고 복잡한 코드라는 점이다. 앞서 보았듯이 module은 단순한 파이썬 파일이다.
하지만 이러한 module도 많아진다면 관리하기 힘들어진다. 따라서 module들을 모아 하나의pakcage에 넣어 관리한다.
Package는 파이썬 파일들로 이루어져 있는 디렉토리(Directory)가 하나의 Package가 된다

image.png

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

import pkg.mod1
from pkg.mod2 import func2

pkg.mod1.func2()
func2()

Package Initialization

가끔은 Package가 import될때 초기 설정을 해줘야 할때가 있다. 클래스의 __init~~메소드가 있는 것처럼 Package도 __init~~.py 파일을 통해 Package 초기 설정이 가능하다.

초기 설정으로 할수 있는 것은 무엇일까?

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

먼저 import 할때 경로의 총 길이 줄여주기 예시를 들면..
pkg에서 mod1과 func2라는 함수를 import 하여 사용하기위해서는 다음과 같이 해야한다
[main.py]

import pkg.mod1

pkg.mod1.func2()

만약에 pkg안에서 다른파일에서 func2()를 호출 할때마다 매번 모든 경로를 다 작성해줘야 하기 때문에 번거롭다. 따라서 다음과 같이 __init~~.py파일을 만들고 초기설정을 하면 된다.
[__init~~.py]

# __init__.py
from mod1 import func2

[sub.py]

# main.py
from pkg import func2

func2()

package에서 import 할 수 있는 변수/함수/클래스를 제한할 수 도 있다.
package를 통해 import 될수 있는 요소들은 모두 __all__ 변수를 통해 정의된다.
그리고 __all__ 변수의 default값은 모든 함수/변수/클래스 이다.
그렇지만 __all__ 변수에 특정 변수/함수/클래스를 지정하면 해당되는 것들만 제한을 둘수 있다.
__all__ 변수는 string 값의 element를 갖는 list이다.
[__init~~.py]

# __init__.py
from mod1 import func2
from mod2 import func3

__all__ = ['func2', 'func3']

[main.py]

main.py

from pkg import *

func2()
func3()
func4() ## <== Error. func4 함수는 all 에 정의되지 않았으므로 import 될 수 없음

다른 사람의 Package 사용

다른 사름이 만든 Package를 import하여 사용하기 위해서는 다른 사람들이 만든 package를 설치해야한다. 예를들어 'Django'라는 Package를 사용하기 위해서는 먼저 설치를 해야 import할수 있다.
파이썬에서 Package 설치는 간단하다.
특히 리눅스기반 OS환경에서는 PIP라는 tool를 사용하면 편리하게 Package를 설치할 수 있다.
PIP란 Python Package Manager이다.

ex
pip install Django

profile
dev_pang의 pang.log

0개의 댓글