TIL6:python- modules & packages

zoeyul·2020년 4월 1일
0

Python

목록 보기
7/16

modules & packages

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

  • len함수를 직접 구현하지 않아도 파이썬에서 이미 모듈로 구현해 놓았음으로 그냥 가져다 쓰면 되는 것 처럼 모듈은 다른 사람들이 이미 만들어 놓은 모듈을 사용할 수 있고, 우리가 직접 만들어서 사용할 수도 있다.

module만들기

  • 단순히 파일을 만든 후 그 안에 재사용 하고 싶은 함수나 클래스 혹은 변수 등을 구현하면 된다.
#my_module.py
my_module_var = 7

def my_module_func():
	return "hello"

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

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

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

alternative ways to import modules

from import

  • imoprt 키워드 외에 from import 키워드를 사용해서 모듈을 불러들일 수 있다.
from my_module import my_module_func, my_module_var
print(my_module_var)
my_module_func()
  • 모듈에서 사용하는 것이 명확할 때 from import를 사용하면 편리하다.

  • 별표를 사용하면 해당 모듈의 모든 요소가 곧바로 imoprt된다.

from my_module import *
  • 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_nme_too_long as f3
f1()
f2()
f3()
  • 모듈 이름도 as를 사용하여 새로운 이름을 줄 수 있다.
import my_module as m1
m1. my_module_func()

packages

  • 모듈과 마찬가지로 다른 파일에서 불러와서 사용하는 개념인데 차이점은 모듈보다 더 크고 복잡한 코드이다.
  • 모듈은 단순한 파이썬 파일이지만 어떠한 모듈들은 코드의 양이 너무 커서 한 파일에 다 넣기에 비효울적일 수 있다.그러할 경우 여러 파일에 나누어 코드를 관리하는 것이 효과적이다.
  • 여러 파일에 나누어져 있는 코드들도 다른 곳에서 하나의 module로 불러와서 사용할 수 있도록 해주는 것이 package이다.
  • 파이썬 파일들로 이루어져있는 디렉토리가 하나의 패키지가 된다. 그리고 디렉토리 이름이 패키지 이름이 된다.
  • 일반 모듈처럼 import하여 사용할 수 있지만 차이점은 클래스 객체를 사용할 때 처럼 dot notation으로 해당 패키지의 원하는 모듈을 import하면 된다.
import pkf.mod1
from plkg.mod2 import func2

pkg.mod1.func2(0
func2()

package initialization

  • 가끔 패키지가 import될 때 초기 설정을 해줘야 할 때가 있다.
  • 파이썬은 __init__.py파일을 통해 package 초기 설정을 가능하게 해준다.
  • 패키지 안에 __init__.py파일이 있으면 패키지가 imoport될 때 __init__.py 파일의 코드들이 자동으로 실해된다

    __init__.py파일을 통해 다음 사항들을 알 수 있다.

    • import할 때 경로의 총길이 줄여주기
    • package에서 import할 수 있는 변수/함수/클래스 제한하기
    • 그 외 package가 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 string)
    그러므로 import되길 원하는 요소들을 string으로 list에 선언해주면 된다.
#__init__.py
from mod1 import func2
from mod2 import func3

__all__ = ['func2', 'func3']

#main.py
from pkg import *

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

다른사람의 package 사용하기

  • 다른사람이 만들 package를 import하여 사용하기 위해서는 먼저 package를 설치 해야 한다.
  • PIP라는 툴을 사용하여 패키지를 사용하면 된다.
  • PIP는 파이썬은 package manager이다. 파이썬을 설치하면 같이 설치되며 pip은 터미널에서 다음 명령어를 사용하면 된다.
pip install Django

0개의 댓글