[Python] - Modules & Packages

김진수·2020년 12월 17일
0

Python

목록 보기
6/8
post-thumbnail

파이썬에서 모듈은 함수 그리고 클래스 등을 모아놓은 파일입니다.

따로 모듈로 모아놓은 이유는 다음과 같습니다.

  • 다른 파일에서 재사용이 가능하게 하고
  • 전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리를 하기 위해서

Module 만들기

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

그 후 단순히 다른 파일에서 불러와 사용하면 됩니다.

모듈을 불러와 사용하기 위해서는 import라는 키워드를 사용하면 됩니다.

주의할 점은 모듈을 import할 때 파일 확장인 ".py"는 제외하고 파일 이름만 사용해서 import 해야 합니다.

원하는 모듈을 import 한 후에는, 다음과 같이 모듈의 원하는 변수/함수/클래스를 사용할 수 있습니다.

예를 들어, my_module 모듈의 my_module_func 함수를 호출하고 싶으면 다음 처럼 할 수 있습니다.

이렇게 모듈 이름을 앞에 붙여줘야 하는 이유는, 그래야 파이썬이 어느 파일을 봐야 해당 함수를 찾을수 있는지 알 수 있기 때문입니다. 만일 모듈 이름을 안붙어주면 파이썬은 모듈의 파일을 보지않고 해당 파일에서만 함수를 찾을려고 합니다.(그리고 못찾을거기 때문에 에러가 납니다.) 이러한 구조를 "name space" 라고 합니다.

Alternative ways to import modules

import 키워드 외에 from import 키워드를 사용해서 모듈을 불러들일 수 있습니다.

예를 들어, my_module 모듈에서 my_module_func 함수와 my_module_var 변수를 import 하고자 한다면 다음처럼 할 수 있습니다.

from import 키워드를 사용하여 모듈을 불러들이는 경우 모듈 이름을 붙이지 않고 곧바로 원하는 함수나 변수 그리고 클래스 호출할 수 있습니다. 모듈에서 명확할때 from import를 사용하면 편리합니다.

다음 처럼 별표(*)를 사용하면 해당 모듈의 모든 요소가 곧바로 import 됩니다.

Import As

만일 여러 모듈을 import하게 되면 이름 충돌이 날 수도 있습니다. 예를 들어 서로 다른 모듈에서 동일한 이름의 함수가 있을 수도 있습니다. 혹은 원하는 모듈의 요소의 이름이 너무 길수도 있습니다. 이러한 경우 Import as 키워드를 사용해서 새로운 이름을 주어서 사용할 수 있습니다.

module이름도 as를 사용하여 새로운 이름을 줄 수 있습니다.

Packages

Packages는 module과 마찬가지로 다른 파일에서 불러와서 사용하는 개념입니다. 차이점은 module보다 더 크고 복잡합 코드라는 점입니다. 앞서 보았듯이 module은 단순한 파이썬 파일입니다.

그러나 어떠한 module들은 코드의 양이 너무 커서 한 파일에 다 넣기에 비효율적일 수 있습니다.

그러할 경우 여러 파일에 나누어서 코드를 관리하는 것이 효과적일 것입니다.

package는 파이썬 파일들로 이루어져 있는 디렉토리 가 하나의 packager가 됩니다. 그리고 디렉토리 이름이 package이름이 됩니다.

package는 일반 모듈 처럼 import하여 사용할 수 있습니다.
다만 차이점은 클래스 객체를 사용할때 처럼 'dot notation'으로 해당 package의 원하는 모듈을 import하면 됩니다.

Package Initializaiton

파이썬은 __init__.py 파일을 통해 package 초기 설정을 가능하게 해줍니다.

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

__init__.py파일은 일반적으로 다음 사항을 할 수 있습니다.

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

import 할 때 경로의 총길이 줄여주기

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

funck2함수를 호출 할때마다 매번 모든 경로를 다 타입해줘야 하기때문에 번거롭습니다.

이런 경우 함수 이름을 곧바로 호출 할 수 있게 편하게 할 수 있는데여 방법은 간단합니다. __init__.py 파일에 먼저 한번 import 해주면 됩니다.

package에서 import할 수 있는 변수/함수/클래스 제한하기

모듈의 모든 함수가 다 외부로 노출될 수 있는건 아닐 수 있습니다. 내부적으로만 사용되어야만 하는 함수도 있을 수 있습니다. 이러한 함수가 package 외부에서 import되어 사용되는 것을 막기 위해서는 __all__변수를 지정해 줄 수 있습니다.

package를 통해 import될 수 있는 요소들은 모두 __all__변수를 통해 정의 됩니다.

그리고 __all__변수의 default값은 모든 함수/변수/클래스입니다.

그러므로 __all__변수를 따로 지정해줌으로 import될 수 있는 요소들을 제한할 수 있은 것입니다.

__all__변수는 string값을 요소를 가지고 있는 list입니다

그러므로 import 되길 원하는 요소들은 string으로 list에 선언해주면 됩니다.

profile
백엔드 개발자

0개의 댓글