파이썬(Python) import

BG·2021년 5월 19일
2

파이썬(Python)

목록 보기
7/7
post-thumbnail

1. import


하나의 웹사이트를 만들려고 할때, 다양한 기능을 하나의 소스파일에 담게 되면 소스코드를 관리하기도 힘이 들며, 차후 유지보수에도 상당한 시간이 소비되는 현상을 겪게 된다.

그럴때는 기능별로 묶어 모듈로 관리하는 것이 좋다.
그렇다면 A소스코드에서 B모듈의 기능을 사용하기 위해서는 어떻게 하면 될까?
그럴때 사용하는것이 import키워드이다.

1-1. module의 import


[모듈이란?]
파이썬에서 모듈이란 쉽게 말해서 함수, 변수등등을 따로 묶어 놓은 소스파일 하나를 말한다.
보통 코딩의 효율화를 위해 기능별로 묶어서 따로 빼놓게 되는데 사람으로 예를 들자면, 팔모듈, 다리모듈 등등이 있을수 있겠다.

[my_module.py]
def my_func():
  print("my_module.my_func")
  
num = 2
[main.py]
import my_module

my_module.my_func()
print(my_module.num ** 3)

결과
my_module.my_func
8

import 키워드를 사용할때는 불러오고 싶은 파일의 확장자 .py는 제외하고 파일명만 적어주면 된다.

그리고 모듈안에 포함된 함수나 변수를 사용하기 위해서는 모듈명.함수명 or 모듈명.변수명을 사용한다.

모듈명을 적어주는 이유는 어디에 있는 함수를 불어와야 하는지에 대해서 명시적으로 지정해주기 위해서 이다.

만약에 main.py파일에도 my_func()라는 함수가 있다고 한다면, my_module.py에 있는 my_func()함수를 불러와야 하는지 main.py에 있는 my_func()함수를 불러와야 하는지 알수 없게 된다.

1-2. import와 함수 호출의 우선순위


[my_module.py]
def my_func():
  print("my_module.my_func")
[main.py]
import my_module

def my_func():
	print("main.my_func")

my_func()

위 main.py를 싱행하면 어떻게 될까?
결과는 아래와 같다.

"main.my_func"가 출력될 것이다.

main.py를 기준으로 my_module.py를 import당하는 쪽, main.py를 import하는 쪽이라고 하면 import하는 쪽의 우선순위가 높다.

1-3. from ... import ...


import 키워드는 이외에 from ... import ... 키워드도 있다.

[my_module.py]
def my_func():
  print("my_module.my_func")
  
num = 2
[main.py]
from my_module import my_func, num

my_func()
print(num ** 3)

결과
my_module.my_func
8

위와 같이 from ... import ... 키워드를 사용하게 되면 모듈명을 명시적으로 지정해 주지 않아도 바로 사용가능하다.

아래와 같이 main.py에 여러 모듈을 from ... import ... 하여 사용할 경우, 동일한 함수명이 존재 한다면 어떻게 해야 될까?(1-3-1에서 계속)

1-3-1. import as


[my_module1.py]
def my_func():
  print("my_module1.my_func")
[my_module2.py]
def my_func():
  print("my_module2.my_func")
[main.py]
from my_module1 import my_func as f1
from my_module2 import my_func as f2

f1()
f2()

결과
my_module1.my_func
my_module2.my_func

위와 같이 as 키워드를 사용하여 alias를 주어 해결가능하다.

as 키워드는 아래 처럼 모듈명을 줄여주는 것도 가능하다.

import my_modula as m1

1-2. package의 import


[package란?]
모듈을 모아놓은 디렉토리라고 생각하면 편할듯 하다.
하나의 모듈에 방대한 양을 담으면 불편한 점들이 많기 때문에 디렉토리 구조로 모듈을 쪼개어 관리하게 되는데 이를 패키지라고 한다.

아래의 구조처럼 모듈을 디렉토리 구조로 관리하게 된다.
leg.py모듈을 찾아가기 위해서는 human.walk.leg가 된다.

그리고 파이썬에서는 package import문의 경로안에 만들어진 폴더에는 반드시 __init__.py파일이 존재해야만 package로 인식하게 된다.
(python 3.3 이후로는 __init__.py 파일이 없어도 package로 인식한다.)

human/
	__init__.py
    walk/
    	__init__.py
        leg.py
        foot.py
    eat/
    	__init__.py
        mouse.py
        tongue.py

package의 import도 모듈과 사용법은 똑같으며, 단지 폴더간의 구분을 .(dot)으로 구분해 주어야 한다.

[human/walk/leg.py]
def fn_leg():
  print("앞으로 이동시킨다.")

[main.py]
import human.walk.leg
human.walk.leg.fn_leg()

결과 : 앞으로 이동시킨다.

1-3. init.py


__init__.py는 패키지를 불러들일때 초기 작업을 진행 시켜주는 곳이다.

__init__.py를 사용하면 함수의 경로를 줄여 준다던지, import되기를 원하지 않는 함수를 제한할 수도 있다.

[패키지 구조]
human/
	__init__.py
    move.py
[move.py]
def fn_move():
	print("이동한다.")
    
def fn_stop():
	print("멈춘다.")
[__init__.py]
from .move import fn_move, fn_stop
[main.py]
from human import *
fn_move()
fn_stop()

결과
이동한다.
멈춘다.

__init__.py의 또 다른 기능으로는 import시키고 싶지 않은 파일을 __all__ 변수를 사용하여 제한할수 있다.

[move.py]
def fn_move():
	print("이동한다.")
    
def fn_stop():
	print("멈춘다.")
[__init__.py]
from .move import fn_move, fn_stop

__all__ = ["fn_move"]
[main.py]
from human import *
fn_move()
fn_stop() --> Error __all__에서 정의 되지 않았으므로 import 불가
profile
글쎄...?

0개의 댓글