python import 모든 사용법부터 관련 PEP8 스타일 가이드 까지

About_work·2023년 1월 5일
1

python clean code

목록 보기
5/11

참고 자료


쉬운 기초

  • 모듈: .py
  • 패키지: 여러 모듈의 묶음 / 패키지는 모듈에 namepsace를 제공한다.
  • 파이썬 표준 라이브러리: 파이썬에 기본으로 설치된 모듈+패키지+내장 함수를 묶어 부르는 용어

모듈 불러오기

  • import 모듈
    • 모듈.변수 , 모듈.함수(), 모듈.클래스()
  • import 모듈 as 이름
  • from 모듈 import 변수 or 함수 or 클래스
  • from 모듈 import 변수 as 이름
  • from 모듈 import * (PEP8 style에서 지양해야함)
  • del 모듈 (불러왔던 모듈을 해제하는 방법)

패키지 불러오기

  • import 패키지.모듈
    • 패키지.모듈.변수 / 패키지.모듈.함수()/ 패키지.모듈.클래스()
  • import 패키지.모듈 as 이름
  • from 패키지.모듈 import 함수 as 이름

기초

__init__.py?

  • 파이썬 3.3 이상부터는 해당 파일이 없어도 패키지로 인식됩니다.
  • 파이썬 3.3 이하에서는 해당 파일이 있어야 패키지로 인식합니다.
  • 기본적으로 안의 내용은 비워 둘 수 있습니다.
  • 예시

모듈 불러오기 2: import 패키지

방법 1: 기본

  • import 패키지 형식으로 패키지만 불러와서 모듈을 사용하려면?
  • calcpkg/init.py 를 아래와 같이 수정합니다.
from .operation import add, mul # 현재 패키지에서 operation 모듈 내 특정 함수를 가져옴
from .geometry import triangle_area, ~ # 현재 패키지에서 geometry 모듈 내 특정 함수를 가져옴
  • 위와 같이 설정하면, import calcpkg 를 한 후, calcpkg.add 처럼 사용하면 됩니다.
  • 혹은 from calcpkg를 한 후, add를 사용해도 됩니다.

방법 2: all로 필요한 것만 공개하기

  • import 패키지 형식으로 패키지만 불러와서 모듈을 사용하려면?
  • calcpkg/init.py 를 아래와 같이 수정합니다.
__all__ = ['add', 'triangle_area']
from .operation import * # 현재 패키지에서 operation 모듈 내 모든 것을 가져옴
from .geometry import * # 현재 패키지에서 geometry 내 모든 것들을 가져옴

주의 사항

  • 아래 calcpkg/init.py 스크립트로는, import calcpkg 만으로 "operation안의 add함수"를 쓰는데 불편함이 있습니다.
  • operation.add로 써야 하고(확인 필요, 이것도 안될 수도 있음), add만으로 쓸 수 없습니다.
from . import operation # 현재 패키지에서 operation 모듈을 가져옴
from . import geometry # 현재 패키지에서 geometry 모듈을 가져옴
  • 파이썬에서 __init__.py 파일은 패키지를 초기화하는 역할도 합니다.
  • **즉 import로 패키지를 가져오면, __init__.py 가 실행됩니다.

모듈의 if __name__== __main__ ?

  • __name__은 모듈의 이름이 저장되는 변수이지만, 모듈이 직접 실행되었을 때는 `__main__으로 들어갑니다.
  • 즉, if __name__== __main__ 는 현재 실행되고 있는 모듈이, 시작점인지 판단합니다.
  • 참고로 import 패키지.모듈 로 호출한 모듈의 __name__ 은 '패키지.모듈' 입니다.
  • child 모듈
print('[child] __name__:', __name__)
  • parent 모듈
import child

print('[parent] __name__:', __name__)
  • python3 parent.py
[child] __name__: child)
[parent] __name__: __main__)
  • python3 child.py
[child] __name__: __main__)

모듈과 패키지 찾는 경로

  • 위 경우 main.py를 실행시킬 때, C:Wproject 밖에 있는 패키지나 모듈을 불러오려면 어떻게 해야할까?
  • 현재 폴더에 모듈/패키지가 없으면, 다음 경로에서 찾습니다.
import sys
sys.path

['C:\\project', 
'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\Lib\\idlelib',
'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\python36.zip',
'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs',
'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\lib',
'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32',
'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages']
  • stie-packages 폴더에는 pip으로 설치한 패키지가 들어갑니다.
  • 내가 만든 모듈, 패키지도 iste-packages 폴더 안에 넣으면, 언제든 모듈/패키지를 사용할 수 있습니다.
  • 만약 가상 환경에서 관리한다면, 가상환경/Lib/site-packages 폴더에 들어갑니다.

중급

하위 패키지란?

  • calcpkg 패키지 안에 operation과 geometry라는 하위 패키지를 만들 수 있다.

  • import 패키지.하위패키지.모듈 과 같이 쓰면 된다.

    • import calckg.operation.element 선언 후 -> calcpkg.operation.element.add(10, 20)
  • 만약, import calckpg 만으로 calckpg.add, calckpg.mul, calckpg.triangle_area 등과 같이 쓰고 싶다면 calcpkg/__init__.py를 아래와 같이 만들어 주면 됩니다.

from .operation.element import *
from .operation.logic import *
from .geometry.shape import *
from .geometry.vector import *

하위 패키지 안에서, 옆에 있는 하위 패키지의 요소를 가져와 사용하고 싶은 경우

  • 위 케이스에서, calcpkg/geometry/shape.py 에서, calcpkg/operation/element.py를 쓰고 싶다면 ..을 이용해야 합니다.
  • ..은 상위 폴더(디렉토리)라는 뜻이며, ...은 상위 폴더의 상위 폴더라는 뜻입니다.
# shape.py
from ..operation import element # from ..operation.element import mul로도 가능
 
def triangle_area(base, height):
    return element.mul(base, height) / 2 # mul(base, height)로도 가능
 
def rectangle_area(width, height):
    return element.mul(width, height) # mul(width, height)로도 가능

패키지의 docstring?

  • init.py 내에 (큰)따옴표 3개를 이용하여 작성합니다.
  • 패키지.__doc__ 을 쓰면, 패키지의 독스트링이 출력됩니다.

import style guide by PEP8

  • 이 규칙을 따르지 않으면, pylint에 걸립니다.

import 기본

  • import는 별도의 줄로 되어있어야 합니다.
# Correct:
import os
import sys

# Wrong:
import os, sys

# 이런식으로 모듈에서 내부 요소들을 호출할 떄는 한줄로 적어도 괜찮다. (검증 필요)
from subprocess import Popen, PIPE

import 위치와 순서

  • import는 모듈의 주석이나 docstring 뒤에 최상단에 와야합니다.
  • import는 Standart library - Related third party - Local application/library 순서대로 그룹화 되야합니다.
''' Doc string '''

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function

import 형식

  • 절대 경로를 사용하여 import 되는 것을 권장합니다.
  • 그 이유는?
    • 가독성이 증가합니다.
    • 에러가 발생될 때에도 에러 메세지가 더 좋게 표시됩니다.
    • 복잡한 패키지 layout에선, 상대경로로 import 하는 것이 허용됩니다.
    • 단, standart lobrary는 복잡한 레이아웃을 피해야 하고, 언제나 절대 경로를 사용해야 합니다.
# absoulte import (절대경로)

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

 

# relative imports (상대경로)

from . import sibling
from .sibling import example

class의 import

  • 클래스가 포함된 모듈에서 클래스를 가져오려면, 일반적으로 from 모듈 import 클래스명을 사용합니다.
  • 만약 클래스 명이 로컬 클래스 명과 충돌한다면, import 모듈 후 모듈.클래스명 으로 사용합니다.

*(asterisk)를 이용한 import 금지. 쓰지말라.

  • 불러온 함수나 클래스의 출처를 알기 어려워져서 가독성을 크게 해치므로 금지하고 있다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글