[TIL]Python. Modules1

여주링·2020년 11월 26일
0

Python

목록 보기
12/15

Modules

개념

파이썬에서 모듈은 변수나 함수 그리고 클래스 등을 모아놓은 파일이다.
왜 파일에다가 모아놓은걸까? 두가지로 설명할 수 있다
1.다른 파일에서 재사용이 가능하게 하기위해
2.전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리를 하기 위해
모듈은 다른 사람들이 이미 만들어놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있습니다.

Module 만들기

import키워드 이용

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

## my_module.py
my_module_var = 7

def my_module_func():
    return "Hello!"

class MyModuleClass:
    pass

그 후 다른 파일에서 불러와 사용하면 된다

#my_module.py이 아닌 다른 파일에서

import my_module

import <모듈 이름>
여기서 주의할 것은 .py는 빼고 해야한다는점이다

원하는 모듈을 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()

from import 키워드 이용

from import 키워드를 사용하여 모듈을 불러들이는 방법이 있다

from my_module import *

모듈 이름을 붙이지 않고 곧바로 원하는 함수나 변수 그리고 클래스를 호출할 수 있습니다. 모듈에서 사용하는 것이 명확할때 from import 를 사용하면 편리합니다.
별표( * )를 사용하면 해당 모듈의 모든 요소가 곧바로 import 됩니다.

from my_module import my_module_func, my_module_var

print(my_module_var)
my_module_func()

하지만 from import는 그닥 추천되는 방법은 아닌데 왜냐하면 local scope를 가지고 있는 다른 변수/함수/클래스 들과 이름 충돌이 날 수 있는데, 이경우 해결원인을 찾기가 어렵기때문

여러 모듈을 import 하게 되면?(import/as)

서로 다른 모듈에서 동일한 이름의 함수가 있을거나 혹은 원하는 모듈의 요소의 이름이 너무 긴 경우,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는 파이썬 파일들로 이루어져 있는 디렉토리(directory)가 하나의 package가 되며 그 디렉토리 이름이 package 이름이 된다.

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

* Import/from import둘다 가능함

가끔은 package가 import 될때 초기 설정을 해줘야 할 필요가 있는데
파이썬은 init.py 파일을 통해 package 초기 설정을 가능하게 해준다.

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

init.py의 역할은 일반적으로 아래와 같다

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

현재 pkg에서 mod1의 func2 라는 함수를 import 하여 사용하기 위해서는 다음과 같이 해야하는데

import pkg.mod1

pkg.mod1.func2()

func2 함수를 호출 할때마다 매번 모든 경로를 다 쳐야 하기때문에 꽤나 번거로워지는데 init.py 파일을 통해 함수의 경로를 줄여줄 수 있다. 방법은 아주 간단!! init.py 파일에 먼저 한번 import구문을 적어주면 됨!

# __init__.py
from .mod1 import func2

이렇게 적어주면

# main.py
from pkg import func2

func2()

위의 예처럼 init.py 파일을 사용해서 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 사용하기

다른 사람이 만들 package를 import 하여 사용고 싶다면 먼저 그 Package를 설치해아한다. 드문 경우를 제외하고 보통은 매우 간단하게 설치할 수 있다.
바로 PIP 라는 툴을 사용하면 된다. PIP는 파이썬의 package manager로 이미 파이썬을 설치했다면 자동으로 같이 설치되어있으니 그냥 터미널에서 명령어만 입력하면된다.

pip install Django 
profile
🌱Backend Developer👩‍💻

0개의 댓글