해당 내용은 codeit 'Python 중급' 강의를 바탕으로 작성된 필기 내용이며, 모든 내용은 본인이 직접 작성하였습니다.
python 패키지에 대해 알아보자.
모듈과 패키지
- 모듈 : 코드를 작은 단위로 나눠서 저장해 놓은 파일
- 패키지 : 모듈들을 모아 놓은 디렉토리
패키지 만들기
- 패키지로 활용할 새로운 디렉토리(폴더)를 만들어준다.(pycharm에서 하든, 윈도우 탐색기에서 하든 상관x)
- 해당 폴더 안에 '
__init__.py
' 파일을 만들어준다. - * 단, 만들 때 모듈 검색 경로 내에 있어야(ex. 실행 코드와 같은 디렉토리) 패키지를 불러올 수 있다(import sys.path 참고)
패키지 import 하기
- 파일에서 패키지 안의 모듈을 import하기 위해서는 '
import 패키지 이름.모듈 이름
' - 패키지 안 모듈을 사용하는 경우
이런 식으로 사용해야 하며,import package.module print(package.module.function())
와 같이 사용할 수도 있다from package.module import function as fn print(fn())
- 한 번에 여러 함수를 import as 하는 경우 예시,
from cil.processing import invert as inv, merge as mrg
__init__
파일에 대해
- 이 디렉토리(폴더)는 파이썬 패키지라는 것을 알려준다.
- initialize의 준말
- 패키지를 초기화 시켜준다. (이 특징을 주의해야 하는 것 같다.)
- 패키지나 패키지의 내용물을 처음 import 시 init파일이 자동으로 실행 된다.
- python 3.3 이전 버전에서는 디렉토리 안에 init 파일이 있어야 패키지를 인식할 수 있었음.(지금은 없어도 패키지로 인식되긴 하지만 구버전 호환성과 패키지 구분을 위해 지금도 init 파일은 만들어 놓는 것이 좋음)
__init__
파일의 활용
1) 패키지 내 모듈 import
__init__
파일 내에 아무 것도 적혀 있지 않으면, 실행 파일에서 패키지만 불렀을 때, 어떤 모듈도 불러올 수 없음
- 하지만,
__init__
파일에 아래와 같이 코드를 적어 놓으면,
실행 파일에서from package import module1, module2
import package
를 하는 것만으로 패키지 내의 모듈을 불러올 수 있음(package.module1
이런 식으로)
- 이 방법은 대부분의 패키지(라이브러리)에 적용돼 있는 것 같다.
ex.
이런 식으로 패키지만 import했지만, 패키지 내의 모듈들을 자유롭게 불러올 수 있음.import pandas as pd a = pd.DataFrame([1, 2])
2) 패키지 내 모듈에서 자주 사용되는 상수, 함수, 객체 한 번만 정의하고 불러오기
__init__
파일에 자주 사용되는 상수, 함수, 객체를 정의하고 각 모듈에서 불러올 수 있다.- 여러 모듈에서 자주 사용되는 상수, 함수, 객체는
__init__
파일에 정의하는 게 좋다.(1)__init__
파일에 아래 코드 작성(2) 모듈 파일에 아래 코드를 작성해 변수를 불러올 수 있음패키지 밖에서도 같은 방법으로 패키지의__init__
에 정의된 상수 등을 불러올 수 있다. from package import PI
PI = 3.14
- ex.
* pycharm에서 2)번을 시행했을 때, 모듈에서 `from package import PI`를 하는 경우 `package`라는 모듈을 찾을 수 없다는 오류가 뜨는데, 해당 문제는 패키지의 상위 디렉토리 경로를 `sys.path.append()`해줌으로써 해결할 수 있긴 하다. 다만, 코드잇 강의와 패키지의 경로가 다른 점이 없는 것 같은데 해당 문제가 왜 발생하는지 모르겠다..
from module import *
의 활용
from module import *
를 통해 모듈 내의 모든 함수를 import할 수 있다.- 그러나, 아무런 조치 없으면
from package import *
을 해도 패키지 내의 모든 모듈이 import되진 않는다.
__all__
특수 변수의 활용
__all__
특수변수를 활용하면import *
시 호출되는 모듈 또는 함수를 지정할 수 있다.
실행 파일\위와 같이 작성 시, 실행 파일에선__all__ = ['module1', 'module2']
package.module1.function
과 같은 방식으로 사용 가능
실행 파일\위와 같이 작성 시 *로 모듈의 모든 함수가 호출되는 게 아니라 리스트 내의 함수만 호출된다.__all__ = ['function1', 'function2]
from package.module import *
- (2)
import *
로 모듈의 함수 호출하기
모듈 파일\ from package import *
- ex.
(1)import *
로 모듈 호출하기__init__
\
Subpackage(서브패키지)
- 패키지 안에 있는 또다른 패키지
import
하는 방식은 똑같다.from package.subpackage.module import function
- ex.
import 총정리
import ...
방식
1)import package
가능
2)import package.subpackage
가능
3)import package.subpackage.module
가능
4)import package.subpackage.module.function
불가능
form .. import ..
방식
1)from package import subpackage
가능
2)from package.subpackage import module
가능
3)from package.subpackage.module import function
가능
4)from package import subpackage.module
불가능- `import` 뒤에는 .을 사용할 수 없다.
- 모든
import
문 뒤에as ..
을 사용해 이름을 바꿔줄 수 있다.
- import를 패키지로 끝내는 경우(
import package
)__init__
파일에 import할 대상(서브패키지, 모듈, 함수 등)을 작성해줘야 한다. (from A) import B
구문을 사용하고,import
된 함수(변수, 패키지, 객체 등)를 사용하는 경우에는from A
는 무시하고 내부 구조에 따라import
뒤에 있는 것만 신경써서B.C.D()
이런 식으로 사용하면 된다! (이는__init__
에서import
한 경우에도 해당된다.)
'개발 공부' 카테고리의 다른 글
백준 문제를 512일간 풀며(종료) (1) | 2023.01.08 |
---|---|
백준 문제를 365일간 풀며 (1) | 2022.08.10 |
[백준] 21606 아침 산책(Python) (0) | 2022.04.17 |