파이썬에서 모듈은 함수 그리고 클래스 등을 모아놓은 파일입니다.
따로 모듈로 모아놓은 이유는 다음과 같습니다.
단순히 파일을 만든 후 그 안에 재사용 하고 싶은 함수나 클래스 혹은 변수 등을 구현하면 됩니다.
그 후 단순히 다른 파일에서 불러와 사용하면 됩니다.
모듈을 불러와 사용하기 위해서는 import라는 키워드를 사용하면 됩니다.
주의할 점은 모듈을 import할 때 파일 확장인 ".py"는 제외하고 파일 이름만 사용해서 import 해야 합니다.
원하는 모듈을 import 한 후에는, 다음과 같이 모듈의 원하는 변수/함수/클래스를 사용할 수 있습니다.
예를 들어, my_module 모듈의 my_module_func 함수를 호출하고 싶으면 다음 처럼 할 수 있습니다.
이렇게 모듈 이름을 앞에 붙여줘야 하는 이유는, 그래야 파이썬이 어느 파일을 봐야 해당 함수를 찾을수 있는지 알 수 있기 때문입니다. 만일 모듈 이름을 안붙어주면 파이썬은 모듈의 파일을 보지않고 해당 파일에서만 함수를 찾을려고 합니다.(그리고 못찾을거기 때문에 에러가 납니다.) 이러한 구조를 "name space" 라고 합니다.
import 키워드 외에 from import 키워드를 사용해서 모듈을 불러들일 수 있습니다.
예를 들어, my_module 모듈에서 my_module_func 함수와 my_module_var 변수를 import 하고자 한다면 다음처럼 할 수 있습니다.
from import 키워드를 사용하여 모듈을 불러들이는 경우 모듈 이름을 붙이지 않고 곧바로 원하는 함수나 변수 그리고 클래스 호출할 수 있습니다. 모듈에서 명확할때 from import를 사용하면 편리합니다.
다음 처럼 별표(*)를 사용하면 해당 모듈의 모든 요소가 곧바로 import 됩니다.
만일 여러 모듈을 import하게 되면 이름 충돌이 날 수도 있습니다. 예를 들어 서로 다른 모듈에서 동일한 이름의 함수가 있을 수도 있습니다. 혹은 원하는 모듈의 요소의 이름이 너무 길수도 있습니다. 이러한 경우 Import as 키워드를 사용해서 새로운 이름을 주어서 사용할 수 있습니다.
module이름도 as를 사용하여 새로운 이름을 줄 수 있습니다.
Packages는 module과 마찬가지로 다른 파일에서 불러와서 사용하는 개념입니다. 차이점은 module보다 더 크고 복잡합 코드라는 점입니다. 앞서 보았듯이 module은 단순한 파이썬 파일입니다.
그러나 어떠한 module들은 코드의 양이 너무 커서 한 파일에 다 넣기에 비효율적일 수 있습니다.
그러할 경우 여러 파일에 나누어서 코드를 관리하는 것이 효과적일 것입니다.
package는 파이썬 파일들로 이루어져 있는 디렉토리 가 하나의 packager가 됩니다. 그리고 디렉토리 이름이 package이름이 됩니다.
package는 일반 모듈 처럼 import하여 사용할 수 있습니다.
다만 차이점은 클래스 객체를 사용할때 처럼 'dot notation'으로 해당 package의 원하는 모듈을 import하면 됩니다.
파이썬은 __init__.py 파일을 통해 package 초기 설정을 가능하게 해줍니다.
package 안에 __init__.py 파일이 있으면 package가 import될때 __init__.py 파일의 코드들이 자동으로 실행됩니다.
__init__.py파일은 일반적으로 다음 사항을 할 수 있습니다.
현재 pkg에서 mod1의 func2라는 함수를 import하여 사용하기 위해서는 다음과 같이 해야합니다.
funck2함수를 호출 할때마다 매번 모든 경로를 다 타입해줘야 하기때문에 번거롭습니다.
이런 경우 함수 이름을 곧바로 호출 할 수 있게 편하게 할 수 있는데여 방법은 간단합니다. __init__.py 파일에 먼저 한번 import 해주면 됩니다.
모듈의 모든 함수가 다 외부로 노출될 수 있는건 아닐 수 있습니다. 내부적으로만 사용되어야만 하는 함수도 있을 수 있습니다. 이러한 함수가 package 외부에서 import되어 사용되는 것을 막기 위해서는 __all__변수를 지정해 줄 수 있습니다.
package를 통해 import될 수 있는 요소들은 모두 __all__변수를 통해 정의 됩니다.
그리고 __all__변수의 default값은 모든 함수/변수/클래스입니다.
그러므로 __all__변수를 따로 지정해줌으로 import될 수 있는 요소들을 제한할 수 있은 것입니다.
__all__변수는 string값을 요소를 가지고 있는 list입니다
그러므로 import 되길 원하는 요소들은 string으로 list에 선언해주면 됩니다.