파이썬 (0404) 5주차

소스코드 관리
모듈
패키지
라이브러리
Author

김보람

Published

April 4, 2022

소스코드 관리(모듈, 패키지, 라이브러리)

intro

- 현재 파이썬은 길이가 2인 벡터의 덧셈을 지원하지 않음

a=[1,2]
b=[3,4]
a+b
[1, 2, 3, 4]

- 아래와 같은 기능을 구현하는 함수를 만들고 싶음

[1,2],[3,4] -> [4,6]

- 구현

def vec2_add(a,b):
    return [a[0]+b[0], a[1]+b[1]]

- test

a=[1,2]
b=[3,4]
vec2_add(a,b)
[4, 6]

make myfuns.py

- 생각해보니까 vec2_add는 내가 앞으로 자주 쓸 기능임

- 그런데 현재 사용방법으로는 내가 노트북파일을 새로 만들때마다 def vec2_add(a,b):와 같은 함수를 매번 정의해줘야 하는 불편함이 있다.

해결1

- 자주 사용하는 함수를 myfuns.py에 저장한다. (4주차 수업)

# myfuns.py
def vec2_add(a,b):
    return [a[0]+b[0], a[1]+b[1]]

%run myfuns를 실행

준비:“00” -> 커널재시작

# 
%run myfuns
vec2_add([1,2],[3,4])
[4, 6]

해결 2

- 자주 사용하는 함수를 myfuns.py에 저장한다. (4주차 수업)

# myfuns.py
def vec2_add(a,b):
    return [a[0]+b[0], a[1]+b[1]]

- import myfuns를 이용

(준비) “00” -> 커널 재시작

import myfuns
a=[1,2]
b=[3,4]
myfuns.vec2_add(a,b)
[4, 6]

import 기본

-사용방법1

준비: “00” -> 커널재시작

import myfuns
myfuns.vec2_add([1,2],[3,4])
[4, 6]
  • myfuns.vec2_add의 의미: myfuns.py라는 파일안에 vec2_add라는 함수가 있음. 그것을 실행하라.
  • .의 의미: 상위, 하위의 개념!

(주의) 아래와 같이 사용 불가능 하다.

vec2_add([1,2],[3,4])  #myfuns가 import가 된거지 vec2Add가 import가 된 것이 아님.
NameError: name 'vec2_add' is not defined

- 사용방법2

준비: “00” -> 커널재시작

from myfuns import vec2_add
vec2_add([1,2],[3,4])
[4, 6]
myfuns.vec2_add([1,2],[3,4])  # myfuns안의 vec2_add만 임포트했지 myfuns자체를 임포트 한것은 아님..
NameError: name 'myfuns' is not defined

- 사용방법3

준비: “00” -> 커널재시작

import myfuns
from myfuns import vec2_add
myfuns.vec2_add([1,2],[3,4])
[4, 6]
vec2_add([1,2],[3,4])
[4, 6]
vec2_sub([1,2],[3,4])   # vec2_sub는 import하지 않았기 때문에 오류남.. 
NameError: name 'vec2_sub' is not defined
myfuns.vec2_sub([1,2],[3,4])
[-2, -2]

- 사용방법4

준비: “00” -> 커널재시작

from myfuns import vec2_add, vec2_sub
vec2_add([1,2],[3,4]), vec2_sub([1,2],[3,4])
([4, 6], [-2, -2])

- 사용방법5

준비: “00” -> 커널재시작

from myfuns import *   # *는 all의 의미
vec2_add([1,2],[3,4]), vec2_sub([1,2],[3,4])
([4, 6], [-2, -2])

- 사용방법6

준비: “00” -> 커널재시작

import myfuns as mf 
mf.vec2_add([1,2],[3,4])
[4, 6]
mf.vec2_sub([1,2],[3,4])
[-2, -2]

(오히려 아래는 실행불가능)

myfuns.vec2_add([1,2],[3,4])
NameError: name 'myfuns' is not defined

- 잘못된 사용방법1

준비: “00” -> 커널재시작

import myfuns as mf
from mf import vec2_add
ModuleNotFoundError: No module named 'mf'

- 사용방법 7

준비: “00” -> 커널재시작

import myfuns as mf
from myfuns import vec2_add as add
mf.vec2_add([1,2],[3,4])
[4, 6]
vec2_add([1,2],[3,4])   # 위에서 vec2_add를 add로 부르기로 했음. 그래서 이건 안뎀 
NameError: name 'vec2_add' is not defined
add([1,2],[3,4])
[4, 6]

도움말 작성기능

- mf란 무엇인가?

준비: “00” -> 커널재시작

import myfuns as mf
mf
<module 'myfuns' from 'C:\\Users\\koinu\\python2022\\myfuns.py'>
mf?
Type:        module
String form: <module 'myfuns' from 'C:\\Users\\koinu\\python2022\\myfuns.py'>
File:        c:\users\koinu\python2022\myfuns.py
Docstring:   <no docstring>
type(mf)
module
  • mf의 타입은 모듈이라고 나옴, 현재 단계에서는 무엇인지 알기 어려움..

- Docstring의 내용을 채울 수 있을까?

준비1: myfuns.py의 파일을 수정한다. (큰따옴표 ““” 세개)

준비2: “00”->커널재시작

import myfuns as mf
mf?
Type:        module
String form: <module 'myfuns' from 'C:\\Users\\koinu\\python2022\\myfuns.py'>
File:        c:\users\koinu\python2022\myfuns.py
Docstring:   이것은 길이가 2인 벡터이 합 혹은 차를 구하는 모듈입니다.

주의점

- myfuns.py는 최초 한번만 import된다.

준비: “00” -> 커널재시작

import myfuns
myfuns.vec2_add([1,2],[3,4])
[4, 6]

myfuns.py파일을 열고 함수를 바꾸자.

"""이것은 길이가 2인 벡터이 합 혹은 차를 구하는 모듈입니다."""

def vec2_add(a,b):
    print("이것은 myfuns.py에 정의된 함수입니다.")
    return [a[0]+b[0], a[1]+b[1]]


def vec2_sub(a,b):
    return [a[0]-b[0], a[1]-b[1]]

다시 myfuns를 로드하고 위를 실행하여 보자

import myfuns
myfuns.vec2_add([1,2],[3,4])
[4, 6]

바뀐내용이 적용되지 않는다.

커널을 다시 시작하고 임포트해보자.

“00” -> 커널재시작

import myfuns
myfuns.vec2_add([1,2],[3,4])
이것은 myfuns.py에 정의된 함수입니다.
[4, 6]

- myfuns.py는 주피너노트북파일과 같은 폴더내에 존재해야 한다.

준비1: “00”->커널재시작

준비2: myfuns.py 을 복사하여 다른 폴더로 이동. 예를들면 IP0403폴더를 만들고 그 폴더안에 myfuns2.py파일을 만들자.

import myfuns  # 주피터노트북과 같은 폴더에 있는 myfuns는 잘 로드되지만
import myfuns2 # 주피터노트북과 다른 폴더에 있는 myfuns2는 그렇지 않다.
ModuleNotFoundError: No module named 'myfuns2'

- IP0403 폴더에 있는 myfuns2.py를 실행하기 위해서는 아래와 같이 할 수 있다.

준비: “00” -> 커널재시작

from IP0403 import myfuns2
myfuns2.vec2_add([1,2],[3,4])
이것은 myfuns2.py에 정의된 함수입니다.
[4, 6]

- 아래도 가능하다.

준비: “00” -> 커널재시작

from IP0403.myfuns2 import vec2_add as add
add([1,2],[3,4])
이것은 myfuns2.py에 정의된 함수입니다.
[4, 6]

참고로 아래는 모두 정의되지 않음

IP0403.myfuns2.vec2_add([1,2],[3,4])
NameError: name 'IP0403' is not defined
myfuns2.vec2_add([1,2],[3,4])
NameError: name 'myfuns2' is not defined
vec2_add([1,2],[3,4])
NameError: name 'vec2_add' is not defined

import 고급

폴더와 함께 사용할시

- 언뜻 생각하면 아래가 가능할 것 같다.

import IP0403
IP0403.myfuns.vec2_add([1,2],[3,4])

- 하지만 불가능

준비: “00” -> 커널재시작

import IP0403

여기까지는 됨..

IP0403.myfuns2.add([1,2],[3,4])
AttributeError: module 'IP0403' has no attribute 'myfuns2'
  • 여기서 불가능하다.

- (암기) IP0403 폴더안에 __init__.py라는 파일을 만들고 내용에 아래와 같이 쓰면 가능하다.

# ./IP0403/__init__.py
form. import myfuns2

준비1: 위의 지침을 따른다.

준비2: “00” -> 커널재시작

import IP0403
IP0403.myfuns2.vec2_add([1,2],[3,4])  
이것은 myfuns2.py에 정의된 함수입니다.
[4, 6]

컴퓨터 상식

  • . : 현재폴더를 의미

  • .. : 상위폴더를 의미

  • ./myfuns.py : 현재폴더안에 있는 myfuns.py를 의미

  • ./IP0403/myfuns2.py : 현재폴더안에 IP0403폴더안의 myfuns2.py를 의미

  • ../myfuns.py : 현재폴더보다 한단계 상위폴더에 있는 myfuns.py를 의미

  • cd ./IP0403 : 현재 폴더안에 있는 IP0403폴더로 이동해라. (cd IP0403으로 줄여쓸 수 있음)

  • cd .. 현재 폴더보다 한단계 상위폴더로 이동해라.

따라서 from . import myfuns2는 현재 폴더에서 myfuns2를 찾아서 임포트 하라는 의미로 해석가능

- 의미상으로 보면 아래가 실해아능할 것 같은데 불가능하다.

# import myfuns.py
from . import myfuns
ImportError: attempted relative import with no known parent package

slite-packages (실습금지)

https://guebin.github.io/IP2022/2022/04/03/(5%EC%A3%BC%EC%B0%A8)-4%EC%9B%942%EC%9D%BC.html#site-packages-(%EC%8B%A4%EC%8A%B5%EA%B8%88%EC%A7%80)

모듈, 패키지, 라이브러리?

- 모듈의 개념은 아까 살펴본 것과 같다. (import를 하여 생기게 되는 오브젝트)

- 교수님들: 모듈이 모이면 패키지라고 부른다. 그리고 라이브러리는 패키지보다 큰 개념이다.

-그런데 구분이 모호하다.

import numpy as np   # 오잉 왜 안되지... 
ModuleNotFoundError: No module named 'numpy'
type(np)
NameError: name 'np' is not defined

- python 에서 numpy의 type은 모듈

- 그런데 numpy package라고 검색하면 검색이 된다.

- 심지어 numpy library 라고 해도 검색가능

- 교수님 생각: 넘파이모듈, 넘파이패키지, 넘파이라이브러리 다 맞는 말임

(숙제)

import myfuns
myfuns.vec2_add([1,2],[5,6])
이것은 myfuns.py에 정의된 함수입니다.
[6, 8]
myfuns?
Type:        module
String form: <module 'myfuns' from 'C:\\Users\\koinu\\python2022\\myfuns.py'>
File:        c:\users\koinu\python2022\myfuns.py
Docstring:   이것은 길이가 2인 벡터이 합 혹은 차를 구하는 모듈입니다. 202250926