About Python – “모듈(1) – import, from”
About Python – “모듈(1) – import, from”
파이썬의 모듈 (Module)
이런 것을 지원하기 위해, 파이썬은 정의들을 파일에 넣고 스크립트나 인터프리터의 대화형 모드에서 사용할 수 있는 방법을 제공합니다. 그런 파일을 모듈 이라고 부릅니다; 모듈로부터 정의들이 다른 모듈이나 메인 모듈로 임포트 될 수 있습니다 (메인 모듈은 최상위 수준에서 실행되는 스크립트나 계산기 모드에서 액세스하는 변수들의 컬렉션입니다).
모듈은 파이썬 정의와 문장들을 담고 있는 파일입니다. 파일의 이름은 모듈 이름에 확장자
파이썬 공식 문서.py
를 붙입니다. 모듈 내에서, 모듈의 이름은 전역 변수__name__
으로 제공됩니다.
다음의 파이썬 코드를 vars.py
라는 이름으로 만들어 봅시다.
myName = "Goddessana_"
yourName = "Users"
def printName():
print("저의 이름은, %s." % myName)
print("당신의 이름은, %s." % yourName)
또, 새로운 파이썬 파일을 a.py
라는 이름으로 만들어 보겠습니다. 내용은 위에서 만들어둔 vars.py
의 printName()
함수를 호출하는 코드 한 줄만 써넣어 보겠습니다. 같은 디렉토리에 만듭니다.
당연하게도 a.py
파일을 실행시켜 보면 NameError: name 'printName' is not defined
에러, 즉 함수가 정의되지 않았다는 오류가 발생합니다. 위의 경우처럼 본인이, 혹은 다른 사람들이 만들어 놓은 파이썬 파일들을 사용해야 하는 경우가 생깁니다. 그럴 때에 사용하는 것이 바로 모듈입니다.
이와 비슷한 경우로, C
에서 printf()
함수를 사용하기 위해서는 함수가 정의된 헤더 파일인 #include <stdio.h>
라는 코드를 맨 윗부분에 적어주어야 했습니다. 마찬가지로, 위의 경우에서도 printName()
함수를 사용하려면 printName()
이 정의된 파일인 vars.py
를 파일에 포함해주어야 합니다. 사용법은 아래와 같습니다.
import 모듈명
그러면, 바로 적용해보겠습니다. a.py
라는 파일을 수정합니다.
import vars
vars.printName()
위의 코드는 아주 잘 동작하는 것을 확인할 수 있습니다. vars.py
에 있는 함수를 사용하기 위해서는, 모듈명.
을 사용해주면 됩니다.
실제로 vars.printName()
와 같은 코드는 아래의 코드와 비슷합니다.
str = "Hello!"
print(str.upper())
객체 str
의 함수 upper()
을 사용하는 방식과 유사합니다. 아래의 흐름을 읽어 봅시다.
str
은str
클래스입니다. (<class 'str'>
)- 클래스에 있는 속성( – 변수 등)이나 메서드를
attribute
라고 부릅니다. - 점(.) 을 찍으면, 해당 객체가 가지고 있는
attribute
를 참조한다는 것인데,str.upper()
은 str 객체가 가지고 있는upper()
라는 이름의attribute
를 참조하겠다는 의미입니다. - 파이썬의
dir()
함수는()
안에 있는 것의attribute
를 반환하는 함수입니다. - 실제로,
dir(str)
을 하면str
객체가 가지고 있는attribute
리스트를 반환하는 것을 확인할 수 있지요. - 그러면,
dir(모듈 객체)
를 하면 어떻게 될까요?
import vars
print(dir(vars))
# ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__',
# '__package__', '__spec__', 'myName', 'printName', 'yourName']
실제로 'myName', 'printName', 'yourName'
처럼 우리가 만들었던 vars.py
파일의 attribute
들이 출력되는 것을 확인할 수 있습니다.
파이썬의 from
키워드
그런데, 위의 vars.printName()
코드처럼 사용하지 않고 printName()
으로 함수를 바로 사용하고 싶으면, 다음과 같이 하면 됩니다.
# from 모듈명 import 모듈함수
from vars import * # * 의 의미는 "모든 것" - vars 모듈의 모든 함수를 사용하겠다는 것입니다.
# from vars import printName 의 의미는 vars 모듈의 printName 함수를 사용하겠다는 것입니다.
printName()
실제로, 위의 코드는 잘 동작하는 것을 확인할 수 있을 것입니다.