TIL[52]. Python_Modules

jake.log·2020년 8월 23일
0

Python

목록 보기
34/39

33.Modules & Packages

  • 모듈: 변수나 함수 그리고 클래스 등을 모아놓은 파일

  • 따로 모듈로 모아놓은 이유:
    다른 파일에서 재사용이 가능하게 하고, 전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리를 하기 위함.

예를 들어, List의 총 요소 개수를 알고 싶은 len 함수를 사용하면 되는걸 이미 확인함

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

print(my_list_length)

파이썬에서 이미 모듈로 구현해놓아서 len 함수를 직접 구현한적은 없다.

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

Module 만들기

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

##my_module.py
my_module_var = 7

def my_module_func():
    return "Hello!"

class MyModuleClass:
    pass

단순히 다른 파일에서 불러와 사용하면 된다.
모듈을 불러와 (import) 사용하기 위해서는 import라는 키워드를 사용하면 된다.

import <모듈 이름>

  • 주의할점: 모듈을 import 할때 파일 확장자인 ".py" 는 제외하고 파일 이름만 사용.

    import my_module

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

    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()
  1. 원하는 모듈을 import 키워드를 사용하여 불러오기.
  2. 그 후 연결된 모듈에서 원하는 변수/함수/클래스 를 사용하기.
  3. 다만 해당 모듈 이름과 연결해서 호출을 해줘야 파이썬이 어느 파일에서 해당 변수/함수/클래스 를 찾을 수 있는지 알 수 있게 됨.

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 를 사용하면 편리.

다음 처럼 별표( * )를 사용하면 해당 모듈의 모든 요소가 곧바로 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 를 사용하여 새로운 이름을 줄 수 있다.

import my_module as m1
m1.my_module_func()

Packages

  • Package는 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 초기 설정을 한다.

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

__init__.py 파일을 통하여 정확히 무엇을 할 수 있는걸까?

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

import pkg.mod1

pkg.mod1.func2()
  • 매번 모든 경로를 다 타입해줘야 함.
  • __init__.py 파일을 통해 함수의 경로를 줄여줄 수 있다.
  • __init__.py 파일에 먼저 한번 import 해주면 된다.
#__init__.py
from .mod1 import func2

#main.py
from pkg import func2

func2()

2. Package에서 import 할 수 있는 변수/함수/클래스 제한하기

__init.py__ 파일을 사용해서 import 할 수 있는 변수/함수/클래스를 제한할 수 있다.
__all__ 변수를 지정: 외부에 노출되면 안 되는 함수가 package 외부에서 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 될 수 없음.

3. 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들

profile
꾸준히!

0개의 댓글