[TIL. 27] Python - Modules

신지원·2021년 3월 23일
0

Python

목록 보기
13/14
post-thumbnail

Modules

모듈은 변수나 함수 클래스를 모아놓은 파일이다.

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

module 만들기

파일을 만들고 그 안에 재사용하고 싶은 함수, 클래스, 변수를 구현하면 된다.

## my_module.py(파일명)      

my_module_var = 7

def my_module_func():
    return "Hello!"

class MyModuleClass:
    pass

module 불러오기

import 이용

# import<모듈 이름>

import my_module

import 할때 파일 확장자는 제외하고 파일 이름만 사용해서 import 해야한다.

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

my_module.my_module_func()

import를 사용해서 모듈을 불러왔을 경우에는, 모듈 이름을 붙여서 모듈을 사용할 수 있다.

  • namespace
    module를 사용할때 모듈이름을 붙여줘야 하는 이유는, 어느 파일을 통해 해당 함수를 찾을 수 있을지 알 수 있기 때문이다. 이름을 붙여주지 않는 경우에는 모듈의 파일을 보지 않고 해당 파일에서만 함수를 찾으려고 할것이다. 이렇게 이름의 공간 혹은 영역을 알려주기 때문에 namespace라고 부른다.
## main.py
import my_module

print(my_module.my_module_var)			# 변수 사용을 위해 모듈 이름을 붙여줌
my_module.my_module_func()				# 함수 사용을 위해 모듈 이름을 붙여줌
my_module_class = my_module.MyModuleClass()
  1. 원하는 모듈을 import 키워드를 사용해서 불러온다. 이를 통해 모듈을 해당 파일과 연결시킨다.
  2. 해당 모듈이름과 연결해서 호출을 하여 연결된 모듈에서 원하는 변수, 함수, 클래스를 사용한다.

from ... import ... 이용

from ... import ... 키워드를 이용해서 모듈을 불러 올 수 있다.

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

from my_module import my_module_func, my_module_var

print(my_module_var)		# 바로 변수 선언해서 사용
my_module_func()			# 함수 바로 사용

이렇게 from... import...를 사용하는 경우 모듈을 사용할때 모듈 이름을 붙이지 않고 바로 사용이 가능하다. (위에서 import를 통해 이미 불러주었기 때문에 모듈이름을 붙이지 않고 바로 사용이 가능하다.

import as

1) 여러 모듈울 import 하게 될 경우 이름이 충돌하여 오류가 발생 할 가능성이 있다.
2) 서로 다른 모듈에서 동일한 이름을 가진 함수, 변수가 있을 수 있다.
3) 원하는 모듈의 요소 이름이 너무 긴 경우

이러한 상황들을 위해서 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()

my_func을 f1로 이름을 다시 명명해주었다.

또한 아래와 같이 module 이름도 as를 이용해서 새로운 이름을 명명해줄 수 있다.

import my_module as m1

m1.my_module_func()

Package

💡 Package 란?

  • module과 똑같이 다른 파일에서 불러와 사용하는거지만 module보다 더 크고 복잡한 코드이다.
  • module의 코드의 양이 너무 커서 한 파일에 넣기가 비효율적이라고 판단되는 경우, 여러 .py 파일로 나누어서 코드를 관리하는 것이 효과적일것이다. 이렇게 여러파일에 나누어져 있는 코드들을 하나의 module로 불러와서 사용할 수 있도록 하는것이 package이다.
  • package는 .py파일들로 이루어져 있는 디렉토리가 하나의 package가 된다.

import 사용 (package에서)

일반 모듈처럼 import 해서 사용할 수 있다.

import pkg.mod1
from pkg.mod2 import func2

pkg.mod1.func2()
func2()

pkg.mod1.func2() 처럼 . 를 사용해서 해당 package의 원하는 모듈을 import 하면 된다.

package initalization

package를 import 해줄때 초기 설정을 해주어야 하는 경우들이 있는데, init.py 파일을 통해 package 초기 설정을 가능하게 해준다.

(package 디렉토리안에 파일들이 들어가 있는 모습)

1. import할때 경로의 총 길이 줄여주기

import pkg.mod1

pkg.mod1.func2()

현재 pkg에서 mod1, func2 라는 함수를 import 하여 사용하기 위한 기본 방법으로 func2 함수를 호출할때 마다 모든 경로를 다 타입해주어야하기 때문에 번거롭다. 그런데 만약에 함수 이름은 곧바로 호출 할 수 있으면 편할텐데, 이때 init.py을 통해 함수의 경로를 줄여줄 수 있다.

# __init__.py
from .mod1 import func2

1) init.py파일에 import해줄 함수나 변수를 먼저 적어준다.

# main.py
from pkg import func2

func2()

2) 원하는 파일에 from ... import ... 형식을 통해서 사용 할 수 있다.

2. 변수, 함수, 클래스 제한하기
모듈의 모든 함수를 다 외부로 노출시키지 않고,내부적으로만 사용할 수 있게 막는 것.
all 변수를 통해 정의 된다.

all 변수의 default 값은 모든 함수, 변수, 클래스이기 때문에 all 변수를 따로 정의해주어 import 될 수 있는 요소들을 제한 할 수 있다.

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

__all__ = ['func2', 'func3']

init 파일에 외부로 노출되지 않도록 하고 싶은 함수 정의

# main.py
from pkg import *

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

all 변수는 string 값을 가지고 있는 list이기 때문에 import 되기 원하는 요소들을 string으로 list에 선언해면 된다.

0개의 댓글