당신은 멋쟁이, 우리는 장고쟁이~

0%

PEP8 Code Layout - Imports

PEP8 Code Layout - Imports (가져오기)



PEP8 코드 레이아웃, imports편 입니다.


imports 는 해당 파일에 다른 함수나 모듈을 불러올때 사용하는 명령어 입니다.


표준 라이브러리 기능이나, 다른 모듈에 있는 함수, 클래스 혹은 메써드들을 가져올때 사용합니다.


PEP8에 따르면, Imports 는 보통 별도의 줄로 되어 있어야 합니다.



1
2
3
4
5
6
# 좋은예 
import os
import sys

# 나쁜예
import sys, os

하지만, 아래의 경우도 괜찮습니다.


1
2
# 좋은예
from subprocess import Popen, PIPE


가져오기는 언제나 파일의 맨 위에 위치해야 하고,

모듈 주석이나 docstring 바로 뒤에 와야 합니다.

그리고 모듈 글로벌값들과 상수들 전에 와야 합니다.



가져오기는 아래 순서의 그룹으로 나뉩니다


  1. 스탠다드 라이브러리 imports
  2. 연관된 3자 모듈 / 라이브러리 imports
  3. 로컬 어플리케이션 / 라이브러리 imports



이 그룹들 사이에는 빈줄을 넣어줘서 가져옵니다



1
2
3
4
5
6
7
8
9
10
# 파이썬 스탠다드 라이브러리 
import os

# 파이썬 3자 모듈/라이브러리
from flask import Flask
from flask_restful import Api

# 로컬 어플리케이션
from local_module import local_class
from local_package import local_function


추천되는 import 방식은, 절대값의 imports 입니다.


절대 경로로 가져오면,

a) 코드에서 가독성이 높아집니다, b) 만약 import system 이 잘못 설정이 되어 있더라도 적어도 에러 메시지가 더 좋게 표시됩니다.



명시적인 상대경로로 import 를 하는것도 허용됩니다.

특히, 절대 경로로 import 하는것이 불필요한 복잡한 패키지 레이아웃에서는

명시적인 상대경로로 import 를 해도 됩니다.



1
2
3
4
5
6
7
8
# 절대값 import 
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

# 명시적인 상대 import
from . import sibling
from .sibling import example


스탠다드 라이브러리 코드는 복잡한 패키지 레이아웃을 피해야 합니다.


언제나 절대 경로의 import 를 하는것이 좋고, 명시적이지 않는 상대 import 는 절대 사용되면 안됩니다.



클래스를 포함하고 있는 모듈에서 클래스를 가져올땐, 보통 클래스명을 써줍니다



1
2
3
4
5
6
7
8
9
10
from myclass import MyClass 
from foo.bar.yourclass import YourClass

# 만약 클래스명이 로컬 이름과 충돌한다면, 명시적으로 스펠링을 해줍니다.
import myclass
import foo.bar.yourclass

# 그리고, 아래를 사용합니다
myclass.MyClass
foo.bar.yourclass.Yourclass



Whildcard 와일드카드 가져오기를 사용하는것은 피해야 합니다.

from <module> import *


1
2
# Wildcard Imports 예시, * 은 모듈에 포함된 모든것을 의미 
from Flask import *


*를 사용하므로써, 모듈에 포함된 모든 클래스와 함수 그리고 메써드들을 불러옵니다.

이럴경우, 어떤 이름들이 네임공간에 있는지 헷갈리게 되고, 자동화툴이나 에디터가 헷갈릴수 있습니다.


와일드카드 가져오기는 보통 내부 인터페이스를 퍼블릭 API 로 재발행 할때 사용합니다.


이 때를 제외하고는, 기본적으로 사용을 피해야 합니다.



마치며..



클래스를 포함하고 있는 클래스 모듈을 가져올때 쓰는 스펠링이 이해가 잘 가지 않습니다.

이 부분은 조금 더 시간을 들여서 더 많은 코드를 접해본다음 이해가 갈것 같습니다.


이해를 마친뒤에 업데이트 할 예정입니다.