도서 파이썬 코딩의 기술Better Way 2 : PEP8 스타일 가이드를 따르라를 참고했습니다.


프로그래밍을 공부하면 코드를 실제로 작성하는 것보다 읽는 경우가 더 많다. 당연히 하드웨어랑 직접 소통하는 개발자가 아닌 이상 여러 코드들의 묶음으로 되어있는 함수나 클래스, 라이브러리 등을 이용하는 경우가 많고, 현업을 하면서 다른 개발자들과 소통을 할 때에도 다른 사람이 작성한 코드를 많이 보게 된다. 그래서 개발자들은 ‘약속’된 방식을 이용해 코드를 작성해야지만 코드에 더 친숙하게 접근할 수 있고, 쉽게 읽고 해석할 수 있다.


이번 포스터에서는 PEP8(Python Enhancement Proposal 8) 스타일 가이드를 통해 어떤 형식으로 Python코드를 작성해야 가독성이 좋은지에 대해 알아보자.


PEP8 스타일 가이드


PEP8은 파이썬 개선 제안서로 파이썬 코드를 어떻게 구상할지 알려주는 스타일 가이드이다. 다양한 부분에서 규칙들이 적용되지만, 대표적으로는 다음과 같다.

  • 공백
  • 명명 규약
  • 식과 문
  • 임포트


공백(Whitespace, Indent)

파이썬 코드는 ‘공백’을 이용해 각 코드들의 관계를 이해한다. 반복문으로 예를 들어보면 다음과 같다.

for i in range(10):
    print(i)

print()가 들여쓰기(공백 4자)로 작성이 된 것을 알 수 있는데, 이 indent를 통해 print()함수가 반복문에 포함되어 있다는 것을 알 수 있다.

이처럼 Python은 공백에 매우 민감하기 때문에 다음과 같은 규칙을 제시했다.

  • tabs대신에 4칸 spacebar를 사용해 들여쓰기(Indent)해라
  • 라인 길이는 79개의 문자보다 적거나 같아야한다.
  • 긴 식을 다음 줄에 이어서 작성할 경우 일반적은 Indent보다 4스페이스 더 들여써야한다.
  • Class안에서 메서드와 메서드 사이에는 빈 줄을 추가해야한다.
  • 딕셔너리에서 키와 콜론(:) 사이에는 공백을 넣지 않고, 한 줄 안에 키와 값을 같이 넣는 경우네는 콜론(:) 다음에 스페이스 하나 추가
  • 변수 대입에서 =연산자 사이에는 전,후로 공백 1칸 씩 추가한다.
  • 타입 표기를 덧붙이는 경우에는 변수 이름과 콜론(:) 사이에 공백을 넣지 않도록 주의, 콜론(:)과 정보 사이에는 공백 1칸 씩 추가한다.
# Class안에서 메서드와 메서드 사이에는 빈 줄을 추가해야한다.
def MyCLass:
    def method1(self):
        ...
    #
    def method2(self):
        ...

# 딕셔너리에서 키와 콜론(:) 사이에는 공백을 넣지 않고, 한 줄 안에 키와 값을 같이 넣는 경우네는 콜론(:) 다음에 스페이스 하나 추가
student = {'name': 'justin'}

# 변수 대입에서 = 연산자 사이에는 전,후로 공백 1칸 씩 추가한다.
num=1 #(x)
num = 1 #(O)

# 타입 표기를 덧붙이는 경우에는 변수 이름과 콜론(:) 사이에 공백을 넣지 않도록 주의, 콜론(:)과 정보 사이에는 공백 1칸 씩 추가한다.
nums: List[int]
target: int


명명규약

Python코드에서 사용하는 여러 요소들의 이름을 명명하는 규약이다.

  • 함수, 변수, 속성(Attribute)는 소문자와 밑줄을 사용한다.(ex. lowercase_underscore)
  • 보호되어야 하는 인스턴스 속성은 일반적으로 속성 이름 규칙을 따르되, 밑줄로 한 개로 시작한다.(ex. _leading_underscore)
  • 비공개(private)(한 클래스 안에서만 쓰이고 다른 곳에서는 쓰면 안 되는 경우) 인스턴스 속성은 일반적인 속성 이름 규칙을 따르괴, 밑줄 두 개로 시작한다.(ex. __leading_underscore)
  • Class(예외도 포함한다)는 여러 단어를 이어 붙이되, 각 단어의 첫 글자를 대문자로 만든다(ex. CapitalizedWord)
# 함수, 변수, Attribute
lower_case

# 보호 인스턴스 Attribute
_lower_case

# private 인스턴스 Attribute
__lower_case

# Class
ThisClass

# 모듈 수준 상수
ALL_CAPS

# Class 메서드
def(cls, ~~~)


식과 문장

식과 문장을 작성하는 스타일 규칙이다.

# 부정을 내부에 넣어라(뒤에)
if not a is b # (X)
if a is not b # (O)

# 빈 컨테이너 그대로 사용(len() 사용x)
# 빈 컨테이너는 암묵적으로 False로 취급
if len(list) == 0 # (X)
if not list: # (O)
if list: #(O)

# 한 줄짜리 if, for, whlile 등 사용x
if not list: print('Hello') # (X)
>>
if not list:
    print('Hello')

# 식이 길어지면 \(백슬래쉬)사용
if (식어너무길면 이어서 계속을 뜻하는 \
   사용해서 다음줄에서 계속 작성)


임포트(Import)

모듈을 임포트(Import)할 때 규칙이다.

  • import문은 항상 파일 맨 앞에 위치시킨다.
  • 임포트 시 절대적인 이름(absolute name)을 사용하고 상대적인 이름은 사용하지 않는다.
  • 상대적인 경로로 임포트해야하는 경우 명시적인 구문을 사용한다.
  • 임포트 시 표준 라이브러리, 서드 파티, 직접 만든 모듈 순서로 섹션을 나눈다.
import foo # (X)
from foo import bar # (O)

# 만약 상대경로 사용 시
from . import foo # 명시적인 구문


Pylint 도구는 PEP8 스타일 가이드를 자동으로 실행해주고, 파이썬 프로그램에서 저지르기 쉬운 다양한 유형의 오류를 감지해준다. 여러 에디터에서 비슷한 도구나 플러그인을 지원한다.


지금까지 PEP8 스타일 가이드에 대해 알아보았다. 코드를 작성하는 것 보다는 읽는 경우가 더 많기 때문에 통일된 스타일로 작성하는 건 매우 좋은 생각이지만, 굳이 가이드를 신경쓰다가 스트레스를 받을 바에는 어느정도 가독성을 해치지 않는 선에서는 임의로 해도 좋지 않을까라는 생각을 잠깐 해보았다.

읽어주셔서 감사합니다.(댓글과 수정사항은 언제나 환영입니다!)