PEP 8
PEP 8 is the de-facto code style guide for Python.
Code lay-out
- 들여쓰기는 공백 4칸 을 권장합니다.
- 한 줄은 최대 79자까지
- 최상위(top-level) 함수와 클래스 정의는 2줄씩 띄어 씁니다.
- 클래스 내의 메소드 정의는 1줄씩 띄어 씁니다.
Whitespace in Expressions and Statements
- 다음과 같은 곳의 불필요한 공백은 피합니다.
- 대괄호([ ])와 소괄호(( ))안
- 쉼표(,), 쌍점(:)과 쌍반점(;) 앞
- 키워드 인자(keyword argument)와 인자의 기본값(default parameter value)의
=
는 붙여 씁니다.
Comments
- 코드와 모순되는 주석은 없느니만 못합니다. 항상 코드에 따라 갱신해야 합니다.
- 불필요한 주석은 달지 마세요.
- 한 줄 주석은 신중히 다세요.
- 문서화 문자열(Docstring) 을 참고하세요.
Naming Conventions
변수명에서 _(밑줄)은 위치에 따라 다음과 같은 의미가 있습니다.
- _single_leading_underscore : 내부적으로 사용되는 변수 를 일컫습니다.
_my_var = 10
- single_trailing_underscore_ : 파이썬 기본 키워드와 충돌을 피하려고 사용합니다.
my_var_ = 10
- __double_leading_underscore : 클래스 속성으로 사용 되면 그 이름을 변경합니다. (ex. FooBar에 정의된 __boo는 _FooBar__boo로 바뀝니다.)
__my_var = 100
- __double_leading_and_trailing_underscore__ : 마술(magic) 을 부리는 용도로 사용되거나 사용자가 조정할 수 있는 네임스페이스 안의 속성을 뜻합니다. 이런 이름을 새로 만들지 마시고 오직 문서대로만 사용하세요.
__my_var__ = 100
소문자 L, 대문자 O, 대문자 I는 변수명으로 사용하지 마세요. 어떤 폰트에서는가독성이 굉장히 안 좋습니다.
모듈(Module) 명은 짧은 소문자로 구성 되며 필요하다면 밑줄로 나눕니다.
- 모듈은 파이썬 파일(.py)에 대응하기 때문에 파일 시스템의 영향을 받으니 주의하세요.
- C/C++ 확장 모듈은 밑줄로 시작합니다.
클래스 명은 카멜케이스(CamelCase)로 작성합니다.
- 내부적으로 쓰이면 밑줄을 앞에 붙입니다.
- 예외(Exception) 는 실제로 에러인 경우엔 "Error"를 뒤에 붙입니다.
함수명은 소문자로 구성하되 필요하면 밑줄로 나눕니다.
- 대소문자 혼용은 이미 흔하게 사용되는 부분에 대해서만 하위호환을 위해 허용합니다.
인스턴스 메소드의 첫 번째 인자 는 언제나
self
입니다.클래스 메소드의 첫 번째 인자는 언제나
cls
입니다.메소드명은 함수명과 같으나 비공개(non-public) 메소드, 혹은 변수면 밑줄을 앞에 붙입니다.
서브 클래스(sub-class)의 이름 충돌을 막기 위해서는 밑줄 2개를 앞에 붙입니다.
상수(Constant) 는 모듈 단위에서만 정의하며 모두 대문자에 필요하다면 밑줄 로 나눕니다.
Programming Recommendations
- 코드는 될 수 있으면 어떤 구현(PyPy, Jython, IronPython등)에서도 불이익이 없게끔 작성되어야 합니다.
None
을 비교할때는is
나is not
만 사용합니다.string
모듈보다는string
메소드를 사용합니다. 메소드는 모듈보다 더 빠르고, 유니코드 문자열에 대해 같은 API를 공유합니다.접두사나 접미사를 검사할 때는
startswith()
와endwith()
를 사용합니다.객체의 타입을 비교할 때는
isinstance()
를 사용합니다.빈 시퀀스(문자열, 리스트(list), 튜플(tuple))는조건문에서 거짓(false)입니다.
불린형(boolean)의 값을조건문에서
==
를 통해 비교하지 마세요.
Give me a reason
하지만 몇몇 규칙은 그 자체만으론 명확한 이유를 찾기 어려운 것도 있습니다. 가령 예를 들면 이런 규칙이 있습니다.
Yes:
x = 1
y = 2
long_variable = 3
No:
x = 1
y = 2
long_variable = 3
보통 저런 식으로 공백을 통해=
를 맞추는 건 보기에도 좋아 보입니다.
하지만변수가 추가되는 경우에는 어떨까요.변수가 추가 될때마다 공백을 유지하기 위해 불필요한 변경이 생깁니다.
이는 소스를 병합(merge)할 때 혼란을 일으키기 쉽습니다.
언뜻 보면 잘 이해가 안 가는 규칙은 이런 것도 있습니다.
Yes:
import sys
import os
No :
import sys, os
굳이 한 줄씩 내려쓰면 길어지기만 하고 보기 안 좋지 않을까요?
하지만 이 역시 대부분의 변경 추적 도구가 행 기반임을 고려하면 그렇지 않습니다.
PEP 8 체크 모듈
설치
실행하면 단일 파일 또는 여러 파일들의 PEP 8 위반 보고서를 얻을 수 있다.
optparse.py:69:11: E401 multiple imports on one line
optparse.py:77:1: E302 expected 2 blank lines, found 1
optparse.py:88:5: E301 expected 1 blank line, found 0
optparse.py:222:34: W602 deprecated form of raising exception
optparse.py:347:31: E211 whitespace before '('
optparse.py:357:17: E201 whitespace after '{'
optparse.py:472:29: E221 multiple spaces before operator
optparse.py:544:21: W601 .has_key() is deprecated, use 'in'