Python/Effective python

[Python] 02. PEP8 스타일 가이드를 따르라

본 포스팅은 <파이썬 코딩의 기술 (개정 2판)> 책을 공부하고 정리한 내용입니다.


PEP란?

Python Enhancement Proposal 의 약자이다. 번역하면 파이썬 개선 제안서,,, 무슨 말이냐면 그냥.. 파이썬 코드를 어떻게 구성할지 정해주는 스타일 가이드이다.

코드는 기능적인 것을 구현하기 위해 언어마다 문법만 지킨다면 코딩 스타일은 사실 개발자 마음이다. 근데 개발을 처음부터 혼자하면 상관 없지만, 대다수의 상황상 우리는 같이 협업하여 서비스를 만들어 내야한다. 당연하게도 각자의 스타일대로 짜고 만나서 설명해주는 비효율성보다는 하나의 고정된 표준 스타일이 있다면 좀 더 효율적인 협업이 가능할 것이다. 그래서 파이썬 내에서 제안된 스타일 가이드가 존재하는데 그게 바로 PEP이다. PEP 8은 깔끔한 파이썬 코드를 작성하는 방법을 자세히 알려준다. 필요하다면 http://222.python.org/dev/peps/pep-0008을 읽으면 됩니다.

꼭 지켜야 할 규칙

공백(whitespace)

  • 탭이 아닌 스페이스 4칸으로 들여쓰자. 우리가 이 부분에 대한 인지가 안되어 있는 경우는 대부분이 편리한 IDE의 기능때문이다. (=Pycharm또는 Visual Studio는 모두 탭을 입력해도 SPACE 4칸으로 변환되도록 설정되어 있기 때문이다. )
  • 표현식이 길어서 다음줄로 이어지면 일반적인 들여쓰기 수준에 추가로 스페이스 4개를 더 들여쓰자.
  • 라인 길이는 79개 문자 이하로 적는다.
  • 파일 안에서 각 함수와 클래스 사이는 빈 줄을 두 줄 넣는다.
  • 클래스 안에서 메서드와 메서드 사이에는 빈 줄을 한 줄 넣는다.
  • 딕셔너리에서 키와 콜론: 사이에는 공백을 넣지 않는다. ex({'id': '2'})
  • 타입 표기를 덧붙이는 경우 변수 이름과 콜론 사이에 공백을 넣지 않도록 주의하고, 콜론과 타입 정보 사이에는 스페이스를 하나 넣는다. (id: int)

명명 규약(naming)

  • 함수, 변수, 속성은 lowercase_underscore 형식을 지킨다.
  • 보호(protected) 인스턴스 속성은 _leading_underscore 형식을 지킨다.
  • 비공개(private) dlstmxjstmsms __leading_underscore 형식을 지킨다.
  • 클래스와 예외는 CapitalizedWord형식을 지킨다.
  • 모듈 수준 상수는 ALL_CAPS 형식을 따른다.
  • 클래스 인스턴스 메소드의 첫 번재 파라미터는 "self"
  • 클래스 메서드에서 첫 번재 파라미터는 'cls'

식과 문

  • 긍정 식을 부정하지 말고(if not a is b) 부정을 내부에 넣어라 (if a is not b)
  • 빈 컨테이너나 시퀀스 ([] or ''등)를 검사할 때 길이를 0과 비교하지 말라. 빈 컨테이너나 시퀀스 값은 False임을 알아라. 그렇다면 len 대신 "if not 컨테이너"의 조건문을 사용하면 된다는 것을 알 것이다.
  • 위와 반대로 비어있지 않는 컨테이너와 시퀀스를 체크할 때, if(len(something)!=0)이 아니라 "if 컨테이너"로 확인하자.
  • 식을 한 줄 안에 다 쓸 수 없는 경우, 식을 괄호로 둘러 싸고 줄바꿈과 들여쓰기를 추가해 읽기 쉽게 만든다.
  • 여러 줄에 걸쳐 식을 쓸 때, \대신 괄호를 쓰자

임포트

  • import문 (form x import y도 포함)을 항상 파일 맨 앞에 위치하라
  • 임포트할 때 절대 이름(absolute name)을 사용한다. 상대 이름 쓰지 말기.
  • 반드시 상대 이름으로 임포트 해야 하는 경우는 from . import foo처럼 명시적인 구문 사용하기]
  • 임포트를 적을 때 표준 라이브러리 모듈, 서드 파티 모듈, 여러분이 만든 모듈 순서로 섹션을 잡는다. 각 섹션에서는 알파벳 순서로 sorting한다.
import os
import sys

from datetime import datetime
import numpy as np
import pandas as pd

from my_custom_utils import custom_datetime_utils

 

더보기

Note : Pylint도구(http://www.pylint.org)는 파이썬 소스 코드를 분석하는 유명한 정적 분석기이다. 파이린트는 PEP 8 스타일 가이드를 자동으로 실행하고 다양한 유형의 오류를 감지해준다. IDE에도 보통 lint 도구나 비슷한 기능을 제공하는 플러그인을 제공하니, 활용해보자.