Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

Python Module&Package

Python Module&Package
Module

  • import- 모듈을 임포트 할 수 있는 방법 ( 참고 )
  • __name__ - entry point of module
  • entry point - file 실행 시작 파일
  • pip list
  • pip show library
  • 모듈 = 인메모리에 하나 존재하는 namespace
1
2
3
4
5
6
7
import module
from module import function
from module import ClassName

import sys
import os
from datetime import datetime

Package/moudles loading

  • sys.path 는 프로그램 setup 중에 초기화
  • python session에서 아래 코드와 같이 수정 가능
  • external package들은 sys.path 안에 site-packages directory를 통해 가지고 있다.
  • aiirflow는 사용 중에 sys.path에 directory 추가
    • dags folder
    • config folder {AIRFLOW_HOME}/config
    • plugins folder
    • airflow version이 1이라면, webserver와 Dags 폴더를 공유
  • unique한 package 이름을 사용해야합니다.
  • 절대로 상대 경로로 Import하지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
print(sys.path)

# result
['/usr/local/airflow/.local/bin',
 '/usr/lib64/python37.zip', 
 '/usr/lib64/python3.7',
 '/usr/lib64/python3.7/lib-dynload',
 '/usr/local/airflow/.local/lib/python3.7/site-packages',
 '/usr/lib64/python3.7/site-packages',
 '/usr/lib/python3.7/site-packages',
 '/usr/local/airflow/dags',
 '/usr/local/airflow/config',
 '/usr/local/airflow/plugins',
 '/usr/local/airflow/dags/wclub']
  • dag folder 내에 .airflowignore 파일을 추가하면 무시해야할 파일을 경로를 표현하여서 넣어주면 된다.(정규식 가능 )
1
2
3
# .airflowignore
test/packages/.*
test/custom_dags/base_dag\.py- u
Package

  • Module들의 모음
  • python 3.3 이하 __init__.py 필수
  • __all__ - package가 import할 module 모음
  • Package의 내용을 가져올 때 import keyword

    1
    
      import <package.module>
    
Class

  • 하나의 파일에 여러 클래스 선언이 가능하다. ( 모듈화 하여 사용한다면,, )
  • Object의 구조 행동을 정의
  • class keyword를 사용하여 새로운 클래스 작성
  • Python은 **Method Overloading**이 없다. ( 같은 Method가 중복되어서 사용되면 첫번째는 무시된다 )
  • Class의 네이밍 컨벤션은 CamelCase

    1
    2
    3
    
      class Class_Test:
      	def __init__(self, param):
      		...
    
  • 외부에서 Class Import

    1
    
      from flight import Class_Test
    
  • 생성자 = Object 생성하기

    1
    
      object_1 = Class_Test()
    
  • __new__ 를 호출하여 Object 생성 할당
  • __init__ 를 호출하여 Object에서 사용할 초기값 초기화

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      class Class_Test:
          def __init__(self):
              print('init')
              super().__init__()
        
          def __new__(cls):
              print('new')
              return super().__new__(cls)
        
          def number(self):
              return 123
        
      test = Class_Test()
        
      > 
      new
      init