[Python] Modules 과 Packages

^_^·2022년 6월 25일
0

Module

사용할 함수나 클래스 등을 구현한 파일을 불러와 사용할 수 있다.


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

class MyModuleClass:
	pass

위와 같은 파일을 만들고 위에있는 내용을 불러와 사용할 파일의 위에 import 해준다.
그후 사용할 함수 my_module_func를 my_module.my_module_func()를 호출한다.


import my_module

my_module.my_module_func()

사용할 함수나 클래스 등에 모듈 이름을 붙이지 않고도 사용할 수 있다.

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

from my_module import my_module_func, my_module_var

import 뒤에 * 를 붙여 모듈의 모든 요소를 import할 수 있다. 하지만 이렇게 하는 방법은 좋지않다. local scope를 가지고 있는 다른 변수/함수/클래스 들과 이름 충돌이 날 수 있는데 이럴 경우 알기가 쉽지 않다고 한다.


여러 모듈을 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를 사용해 새로운 이름을 줄 수 있다.


import my_module as m1

m1.my_module_func()

Packages

package는 module과 마찬가지로 다른 파일에서 불러와 사용하는 개념이다. 차이점은 module보다 더 크고 복잡한 코드라는 점이다.
module의 코드 양이 너무 커 한파일에 넣기 비효율 적일 수 있다. 그럴때 여러 파일에 코드를 나누어 관리하는 것이 효과적이고 여러 파일에 나누어져 있는 코드를 다른 곳에서 하나의 module로 불러와 사용할 수 있게 해준다. 그런 파이썬 파일들로 이루어져 있는 디렉토리가 package이다.

import 디렉토리명.모듈파일명 으로 사용할 수 있고
from 디렉토리명.모듈파일명 import (함수, 변수, 클래스 등) 으로 사용한다.


import pkg.mod1
from pkg.mod2 import func2

pkg.mod1.func2()
func2()

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

Package 안에 __init
_.py 파일이 있으면 package가 import 될때 __init__.py 파일의 코드들이 자동으로 실행된다.

__init__.py의 기능

  1. Import 할때 경로의 총 길이 줄여주기
    import할때 경로의 총길이 줄여주기에 대해서 보자. 현재 현재 pkg에서 mod1의 func2 라는 함수를 import 하여 사용하기 위해서는 다음과 같이 해야한다.

import pkg.mod1

pkg.mod1.func2()

func2()를 호출할 때마다 경로를 다 입력해야 해서 번거롭다. __init__.py안에 func2함수를 먼저 한번 import하게되면 함수의 이름만 입력해 사용할 수 있다.


# __init__.py
from .mod1 import func2

# main.py
from pkg import func2

func2()
  1. Package에서 import 할 수 있는 변수/함수/클래스 제한하기
    내부적으로만 사용해야 하는 함수가 있는경우 package 외부에서 import 되어 사용되는 것을 막기 위해 __all__ 변수를 지정해 줄 수 있다.
    package를 통해 import될 수 있는 요소들은 모두 __all__변수를 통해 정의된다.
    따라서 __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가 import될때 꼭 먼저 실행되어야 하는 코드들을 입력해 사용할 수 있다.

0개의 댓글