[PEP8] PEP8 정리 - 1
A Foolish Consistency is the Hobgoblin of Little MInds
- 코드는 작성하는 것보다 읽는 것이 더 쉬워야 한다.
- 만약 프로젝트에서 어떤 가이드 라인을 이미 따르고 있다면, 해당 프로젝트의 가이드라인이 우선된다.
- PEP8은 권장사항이지 절대적인 법칙은 아니다.
- 가이드라인을 준수하지 않아도 되는 대표적 사례
- PEP8에 따라 코드를 읽는 사람임에도 불구하고, 가이드라인을 적용하는 것이 코드 가독성을 해칠 경우
- 과거에 PEP를 준수하지 않고 작성한 코드와의 일관성을 유지하는 경우
- 코드의 작성 시기가 PEP8의 작성 시기보다 앞서며, 그리고 코드를 수정할 필요가 없을 경우
- 과거 버젼의 파이썬으로 작성된 코드가 PEP8을 준수할 경우, 작성된 코드가 작동하지 않아 과거 버젼과 호환될 필요가 있을 경우
Code Lay-out
Indentation
-
스페이스 4칸을 사용해라
-
괄호 및 괄호안의 괄호와 같이 연결되는 라인에서 줄바꿈이 일어나는 요소들은 수직 정렬되어야 한다.
-
# YES # 여는 구분 기호로 정렬되는 경우 foo = long_function_name(var_one, var_two, var_three, var_four) # 아랫줄과 구분을 위해 더 많은 들여쓰기가포함된 경우 def long_function_name( var_one, var_two, var_three, var_four): print(var_one) # 매달린 형태의 들여쓰기는 하나의 들여쓰기 레벨을 추가해야 한다. foo = long_function_name( var_one, var_two, var_three, var_four)
-
# NO # 첫 수직 정렬이 안되어 있을 때, 첫째 줄은 금지되며 문제의 소지가 있음 foo = long_function_name(var_one, var_two, var_three, var_four) # 더 많은 들여쓰기가 필요한 경우, 함수 안 첫째줄과 구분이 어려움 def long_function_name( var_one, var_two, var_three, var_four): print(var_one)
-
if 구문이 여러 줄을 사용할 정도로 길 경우, if, ( , 스페이스 한칸은 총 4개의 스페이스와 같은 길이를 만드므로 if 구문의 첫째줄과 혼동을 일으킬 여지가 존재
-
PEP8에서는 명확한 입장을 제시하지는 않으나 다음 예제와 같은 몇가지 옵션을 제시
-
# 추가적인 들여쓰기가 없는 경우 if (this_is_one_thing and that_is_another_thing): do_something() # 문법적으로 강조를 하여 if 구문과 본문을 구분하기 위한 주석 추가 if (this_is_one_thing and that_is_another_thing): # Since both conditions are true, we can frobnicate. do_something() # 아랫 줄에 추가적인 들여쓰기 if (this_is_one_thing and that_is_another_thing): do_something() # 경우에 따라 if 문에 연산자가 추가될 경우 연산자 혹은 후에 줄바꿈을 할 것인지에 대한 부분은 뒤 연산자 부분 참고
-
여러줄 괄호의 경우
-
# 첫번쨰 요소 아래 맞추는 경우 my_list = [ 1, 2, 3, 4, 5, 6, ] # 라인의 가장 앞에 맞추는 경우 my_list = [ 1, 2, 3, 4, 5, 6 ]
Tabs or Spaces?
- 스페이스가 선호되는 내어쓰기 방법
- but, 이미 과거에 작성된 코드에 적용되어 일관성 유지할 필요가 있을 경우 탭을 사용해도 된다
- python3의 경우 탭과 스페이스의 조합은 문법 오류가 발생
- python2의 경우 탭과 스페이스가 섞여있는 경우 탭이 스페이스로 변환
Maximum Line Length
- 한 줄의 최대 길이는 79문자로 제한
- 독스트링이나 주석과 같이 구조적 제한이 적은 긴 텍스트 블럭을 처리하기 위해선 한줄의 최대 길이는 72로 제한
- 인접한 열에 두 버전을 제공하는 코드 리뷰 툴을 사용할 때 작업효율이 좋아진다.
- 행바꿈을 하면 코드의 가시적 구조를 파괴하여 이해하기 어렵게 만든다.
- 한줄 길이가 긴것을 선호할 때는 어느정도 허용된다.
- 파이썬 표준 라이브러리는 보수적이며, 79글자 이내로 제안하는 것을 요구
- 백슬래시를 활용하는 것은 매우 적절하다.
Should a Line Break Befor or After a Binary Operator?
-
# No: operators sit far away from their operands income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
-
# Yes: easy to match operators with operands income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
Blank Lines
- 가장 높은 위치에 있는 함수와 클래스의 정의 사이에는 2개의 줄바꿈을 사용
- 클래스 내부의 메서드 정의는 위 아래로 줄바꿈을 사용하여 구분
- 추가적인 빈줄은 연관된 함수들의 그룹을 분리하는데 사용
- 줄바꿈은 한줄 짜리 묶음 에서 생략될 수 있다.
- 함수 내에 논리 섹션을 나타내기 위해 빈줄을 사용할 수 있으나, 적당히 사용해야한다.
Source File Encoding
- UTF-8 을 사용해야 한다.
- ASCII(python2) 혹은 UTF-8을 사용하는 파일들은 인코딩 선언을 해서는 안된다.
- 표준 라이브러리에서는 기본 값이 아닌 인코딩은 오직 테스트 목적이나 주석 및 독스트링에 코드 작성자 이름을 언급할 때문 사용되어야 한다.
imports
-
행으로 구분되어 사용되어야 한다.
-
# YES import os import sys
-
# NO import sys, os
-
# YES from subprocess import Popen, PIPE
-
만약 import 시스템이 부정확하게 설정된 경우 위처럼 그룹화가 된다면 읽기 쉬워지며 수저이 용이해지므로, Absolute import가 권장됨
-
그러나 쓸데없이 장황한 곳에서 복잡한 패키지 레이아웃을 다루고 있을 때, Absolute import에 대해 Explicit relative import는 적용 가능한 대안
-
from .import sibling from .sibling import example
- Wild import는 사용하지 않도록 한다.
Module Level Dunder Names
-
반드시 모듈 독스트링 뒤에 쓰여져야 하고, from __ future__ mport 를 제외하고는 import문 전에 쓰여져야한다.
-
"""This is the example module. This module does stuff. """ from __future__ import barry_as_FLUFL __all__ = ['a', 'b', 'c'] __version__ = '0.1' __author__ = 'Cardinal Biggles' import os import sys